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
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.