![]() |
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:
und zum Empfangen
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;
Delphi-Quellcode:
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.
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; 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 16:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz