Entwickler-Ecke

Internet / Netzwerk - Socket Verbindung -> nicht alle bytes kommen an


Saiz - Do 23.09.10 17:04
Titel: Socket Verbindung -> nicht alle bytes kommen an
Hallo zusammen,

ich habe folgendes Problem mit meinem Client-Server Programms das mit Sockets arbeitet:

Ich will eine Datei zum Server schicken. Das klappt mit dem Code nicht:

Client:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    begin
        AssignFile(F, sString);
        Reset(F, 1);
        Repeat
          ZeroMemory(@bBuff[0],4096);
          BlockRead(F, bBuff[0], Length(bBuff), cRead);
          If (cRead = 0Then Break;
          sSocket.SendBuf(bBuff[0],cRead);
         sSocket.ReceiveBuf(bBuff,1);
       Until 1 = 3;
        CloseFile(F);
        Sleep(100);
        sString := 'DONE';
       MessageBox(0,'Update Server successful''Update Server', MB_OK);
        //send(sSocket,sString[1],4,0);
    end;



Server:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
Function RecvFile(P: Pointer): integer; STDCALL;
Var
  icSock:Integer;
  origSock:Integer;
  Addr          :TSockAddrIn;
  WSA           :TWSAData;
  F             :File;
  Buf           :Array[0..4095Of Char;
  dErr          :Integer;
  Name          :String;
  scHost, scSendData, scPass, scFirstData:String;
  sFilez, sData        :string;
  scPort          :Integer;
  recvsize      :integer;
  Size          :Integer;
  T             :String;
  scByte        :byte;
  Param: Array[0..100]of String;
Begin
  Name := 'Update.pdf';
  scHost := PInfo(P)^.scHost;
  scPort := PInfo(P)^.scPort;
  scByte := PInfo(P)^.scPackHead;
  scPass := PInfo(P)^.scPassword;
  Size := PInfo(P)^.scSize;
  sFilez := PInfo(P)^.scFile;
  sData := PInfo(P)^.scData;
  StripOutParam(sData,Param);

    WSAStartUP($0101, WSA);
    icSock := Socket(210);
    Addr.sin_family := 2;
    Addr.sin_port := hTons(scPort);
    Addr.sin_addr.S_addr := inet_Addr(pchar(scHost));
    If Connect(icSock, Addr, SizeOf(Addr)) = 0 Then begin
      SendPacket(icSock,scByte,scPass, Param[0]);
      Sleep(1000);
    {$I-}
    T := 'ok';
    recvsize := 1;
    AssignFile(F, Name);
    Rewrite(F, 1);
    Repeat
      FillChar(Buf, SizeOf(Buf), 0);
      dErr := Recv(icSock, Buf, SizeOf(Buf), 0);
      if dErr = -1 then Break;
      if Size < (derr + recvsize) then begin
        BlockWrite(F, Buf, Size - recvsize + 1);
        Inc(recvsize, derr);
      end else begin
        Inc(recvsize, dErr);
        BlockWrite(F, Buf, derr);
      end;
      dErr := Send(icSock, T[1], Length(T), 0);
      if dErr = -1 then Break;
    Until recvsize >= Size;
    CloseFile(F);
    {$I+}
  end;
End;


Mit dem Code kriege ich immer die Datei z.B. PDF mit nur 8Kb oder 12kb zurück. Obwohl das PDF 300kb ist.

JETZT KOMMT ES ABER:

Wenn ich in den Client Sleep(200) oder größer Einbaue ... kriege ich meine komplette PDF:


Client:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    begin
        AssignFile(F, sString);
        Reset(F, 1);
        Repeat
          ZeroMemory(@bBuff[0],4096);
          BlockRead(F, bBuff[0], Length(bBuff), cRead);
          If (cRead = 0Then Break;
          sSocket.SendBuf(bBuff[0],cRead);
         sSocket.ReceiveBuf(bBuff,1);
         Sleep(200);  <--------------- DANN KLAPPT ES.
       Until 1 = 3;
        CloseFile(F);
        Sleep(100);
        sString := 'DONE';
       MessageBox(0,'Update Server successful''Update Server', MB_OK);
        //send(sSocket,sString[1],4,0);
    end;



Wieso ist das so? was ist da falsch? Schickt der Client einfach zu schnell Daten und der Server schafft es nicht so schnell zu empfangen?
Wieso kann ich das Synchronisieren?


Vielen Dank im voraus für eure Hilfe.