Einzelnen Beitrag anzeigen

Xeno1

Registriert seit: 16. Dez 2009
1 Beiträge
 
Lazarus
 
#1

Dateien Senden (LNET) Empfang hängt sich auf

  Alt 20. Dez 2009, 14:47
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='FILEthen
  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.
  Mit Zitat antworten Zitat