Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Dateien Senden (LNET) Empfang hängt sich auf (https://www.delphipraxis.net/144949-dateien-senden-lnet-empfang-haengt-sich-auf.html)

Xeno1 20. Dez 2009 14:47


Dateien Senden (LNET) Empfang hängt sich auf
 
Hallo allerseits

Ich hab hier mal ein Problem:

Und zwar verwende ich lNet in Lazarus und will damit dann auch dateien senden
und dann natürlich empfangen.
Wenn der Sender zu schnell Sendet wartet er auch brav bis er wieder Senden darf.
Eig sollter der Empfänger auch brav warten bis er weiter empfangen kann. Das tut er auch
aber dann wenn er wieder empfangen könnte liefert Get(b[0],Packetsize) weiterhin 0 zurück und er
empfangt nichts. Niemehr :wall: :wall:

Ich hab zum Senden folgendes Programmiert:
Delphi-Quellcode:
procedure TForm2.DateiSenden;
var dn:shortstring;
    Filestream:TFileStream;
    b:array of byte;
    rest,check:integer;
begin
  Opendialog1.Execute;
  dn:=Opendialog1.FileName;
  Filestream:=TFileStream.Create(dn,fmopenread);
  dn:=ExtractFileName(dn);
  Progressbar1.Max:=Filestream.Size;
  Progressbar1.Position:=0;
  setlength(b,PacketSize);
  if Assigned(FileTCP.Iterator) then repeat
                                 FileTCP.Send(shortstring('FILE'),sizeof(dn),FileTCP.Iterator);
                                 FileTCP.Send(dn,sizeof(dn),FileTCP.Iterator);
                                 FileTCP.Send(filestream.Size,sizeof(filestream.Size),FileTCP.Iterator);
                                 Filestream.Seek(0,sofrombeginning);
                                 repeat
                                   Filestream.Read(b[0],PacketSize);
                                   check:=0;
                                   repeat
                                     check:=FileTCP.Send(b[0],PacketSize,FileTCP.Iterator);
                                     caption:=inttostr(check);
                                     application.ProcessMessages;
                                     until check=PacketSize;
                                   Progressbar1.Position:=Filestream.Position;
                                   LTrans.Caption:=inttostr(Progressbar1.Position);
                                   LRemain.Caption:=inttostr(Progressbar1.Max-Progressbar1.Position);
                                   application.ProcessMessages;
                                   until Filestream.Size-Filestream.Position<PacketSize;
                                 if Filestream.Size-Filestream.Position>0 then
                                   begin
                                   rest:=Filestream.Size-Filestream.Position;
                                   setlength(b,rest);
                                   Filestream.Read(b[0],rest);
                                   check:=0;
                                   repeat
                                     check:=FileTCP.Send(b[0],rest,FileTCP.Iterator);
                                     application.ProcessMessages;
                                     until rest=check;
                                   Progressbar1.Position:=Filestream.Position;
                                   LTrans.Caption:=inttostr(Progressbar1.Position);
                                   LRemain.Caption:=inttostr(Progressbar1.Max-Progressbar1.Position);
                                   end;
                                 until not FileTCP.IterNext;
  FileStream.Free;
  Hide;
end;
und zum Empfangen
Delphi-Quellcode:
procedure TForm2.FileTCPReceive(aSocket: TLSocket);
var
    dn,s:shortstring;
    fsize:Int64;
    Filestream:TFileStream;
    b:array of byte;
    check:integer;
begin
if not downloading then
begin
asocket.Get(s,sizeof(dn));
if s='FILE' then
  begin
  Show;
  downloading:=true;
  asocket.Get(dn,sizeof(dn));
  LName.Caption:=string(dn);
  Filestream:=TFileStream.Create('./'+dn,fmcreate);
  asocket.Get(fsize,sizeof(fsize));
  LSize.Caption:=inttostr(fsize);
  Progressbar1.Max:=fSize;
  setlength(b,PacketSize);
  sleep(100);
  repeat
  check:=0;
  repeat check:=asocket.Get(b[0],PacketSize); application.ProcessMessages; caption:=inttostr(check); until check=PacketSize;
  FileStream.Write(b[0],PacketSize);
  Progressbar1.Position:=Filestream.Position;
  LTrans.Caption:=inttostr(Progressbar1.Position);
  LRemain.Caption:=inttostr(fsize-Progressbar1.Position);
  application.ProcessMessages;
  until fsize-Filestream.Position<PacketSize;
  if fsize-Filestream.Position>0 then
    begin
    setlength(b,fSize-Filestream.Position);
    repeat
      check:=asocket.Get(b[0],fsize-Filestream.Position);
      application.ProcessMessages;
      caption:=inttostr(check)
      until check=fsize-Filestream.Position;
    FileStream.Write(b[0],fsize-Filestream.Position);
    Progressbar1.Position:=Filestream.Position;
    LTrans.Caption:=inttostr(Progressbar1.Position);
    LRemain.Caption:=inttostr(fsize-Progressbar1.Position);
    end;
  Filestream.Free;
  if server then showmessage('Sie sind der Server wenn sie wollen, dass alle diese Datei erhalten müssen sie sie '+
                             'erneut verschicken');
  FileTCP.IterReset;
  downloading:=false;
  Hide;
  end;
end;
Hab auch mal versucht beim Empfang ganz am Anfang ein Haltepunkt zu setzten dass wird auch nicht mal mehr ausgelößt wenn er wieder Empfangen kann ansonsten hätte ich dass probiert eben weiterzuempfangen sobald dass wieder ausgelöt wird.

Ich weiß dass da noch ein paar Schönheitsfehler drinn sind aber erstmal wollte ichs zum laufen bringen bevor ich mich um den Benutzerkomfort und Schönheitskorrekturen kümmere.
Hab ich irgendwas grundsätzlich falsch gemacht oder wo liegt der Denkfehler?

Danke für die hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz