Registriert seit: 23. Sep 2010
2 Beiträge
|
Es kommen zu wenig bytes an
23. Sep 2010, 16:57
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-Quellcode:
begin
AssignFile(F, sString);
Reset(F, 1);
Repeat
ZeroMemory(@bBuff[0],4096);
BlockRead(F, bBuff[0], Length(bBuff), cRead);
If (cRead = 0) Then 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-Quellcode:
Function RecvFile(P: Pointer): integer; STDCALL;
Var
icSock:Integer;
origSock:Integer;
Addr :TSockAddrIn;
WSA :TWSAData;
F :File;
Buf :Array[0..4095] Of 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(2, 1, 0);
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-Quellcode:
begin
AssignFile(F, sString);
Reset(F, 1);
Repeat
ZeroMemory(@bBuff[0],4096);
BlockRead(F, bBuff[0], Length(bBuff), cRead);
If (cRead = 0) Then 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.
|