Autor Beitrag
Saiz
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 23.09.10 17:04 
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:

ausblenden 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:

ausblenden volle Höhe 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:

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