大量发送接收数据时会出现此问题,原因是由于在发送数据时系统的数据缓冲区不足造成的,解决的方法是修改Delphi带的SCKTSRVR.EXE (在Source/Vcl中有源码)和 TSocketConnection这两个东西,主要是修改SConnect单元中的下面的发送函数,不要把包一次发出而是分多次发出。
function TSocketTransport.Send(const Data: IDataBlock): Integer;
var
P: Pointer;
begin
Result := 0;
InterceptOutgoing(Data);
P := Data.Memory;
FSocket.SendBuf(P^, Data.Size + Data.BytesReserved);
end;
把SConnect拷贝出来改个名字,如:SConnectEx,把上边的函数改为,重新编译SCKTSRVR.EXE 和你的客户端,就OK了
function TSocketTransport.Send(const Data: IDataBlock): Integer;
const
SEND_SIZE = 4096;
//每次最多发4k
var
P: Pointer;
Size, SendedSize, BufSize: Integer;
begin
Result := 0;
InterceptOutgoing(Data);
P := Data.Memory;
Size := Data.Size + Data.BytesReserved;
SendedSize := 0;
while SendedSize < Sizedo
begin
P := Pointer(LongInt(P)+SendedSize);
BufSize := Size - SendedSize;
if BufSize > SEND_SIZE then
BufSize = SEND_SIZE;
Inc(SendedSize, FSocket.SendBuf(P^, BufSize));
end;
end;