Socket i anulowanie wysyłania

Odpowiedz Nowy wątek
2009-10-31 21:10
Taaajniak
0

Witam wszystkich userów. Pobrałem kod z tej strony odnośnie gniazd lecz mam problem. Co zrobić aby zamknąć klienta jak plik jest wysyłany?

Jak dam do Form1.Close procedure Client.Close to niestety w programie serwer wyświetla że klient zerwał połączenie lecz w tym kliencie wygląda jakby plik był wysyłany.

Aby zaprzeczyć tej sytuacji w Client.Close dałem że w label1 pojawia się słowo koniec

W procedurze wysyłania pliku dałem if sprawdzające, że jeśli koniec to nie wysyła i nie wyświetla głupot czyli danych że niby wysyła...

procedure TMainForm.SendFile(const FileName: String);
var    
  SrcF : File;
  RealSize : Integer;  // realna odczytana wartosc z pliku
  Buffer : array[0..Count] of char;  // bufor przesylanych danych
  TotalSize : Int64;
begin
  TotalSize := 0;
  AssignFile(SrcF, FileName);
  try
  { otwieramy plik zrodlowy i okreslamy jego rozmiar }
    Reset(SrcF, 1);
    lblProgress.Caption := 'Wysy?anie pliku...';
   ProgressBar.Max := FileSize(SrcF);

    if IsServer then
      Server.OnClientRead := RecievePercentage
    else Client.OnRead := RecievePercentage; 

    repeat
     if label1.caption <> 'koniec' then
      begin
      Application.ProcessMessages;
      Sleep(10);

      Seek(SrcF, TotalSize); // przesun na odpowiednia pozycje w pliku
    { tutaj nastepuje odczytanie 1 KB danych i przypisanie ich do bufora }
      BlockRead(SrcF, Buffer, SizeOf(Buffer), RealSize);

      if RealSize > 0 then  // jezeli liczba odczytanych bajtow jest wieksza od zera...
      begin
      { wyslij pakiet... }
        if IsServer then
          Server.Socket.Connections[0].SendBuf(Buffer, RealSize)
        else Client.Socket.SendBuf(Buffer, RealSize);
        TotalSize := TotalSize + RealSize;
      end;
     end;
    until RealSize = 0;
  finally
    CloseFile(SrcF);
    progressbar.Position:=0;
    lblProgress.Caption := 'Plik wys?ano.';
  end;
end;

Lecz forma się nie zamyka i nie da się jej zamknąć:

Cały sens działania:
Form1.Close -> Client.Close -> Label1.Caption := 'koniec'; -> if jeśli koniec to nie powtarza pętli chodź jest powtarzana ale jej skutków nie widać :)

Co zrobić żeby to zdziałało czyli, żeby podczas wysyłania pliku od klienta do serwera po próbie zamknięcia okna (programu) klient program się wyłączył?

Pozostało 580 znaków

2009-10-31 23:18
Taaajniak
0

Pomoże ktoś mi rozwiązać ten problem? ;-(

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0