Dar*_*tar 8 sockets delphi udp
我正在制作UDP C/S. 我遇到服务器每秒可以接收的数据数量问题.
我已经测试过向服务器发送10,100,1000批数据消息,10,100没有问题.发送1000时,只收到300~400.所有测试都在本地进行.
我尝试使用ICS的twsocket和Synapse的tudpblocksocket来实现服务器.两者都出现了同样的问题.
可以向我解释为什么会发生这种情况,以及如何改善服务器性能.
使用TUDPBlockSocket的代码
...
while not Terminated do
begin
try
sz := FUDPServer.WaitingData;
if sz > 0 then
begin
FUDPServer.RecvBuffer(mem.Memory, sz);
mem.Seek(0, 0);
AMessage := fFormats.ReadFromStream(mem);
DoMessageReceived(FUDPServer.RemoteSin.sin_addr, AMessage);
end;
finally
end;
end;
Run Code Online (Sandbox Code Playgroud)
...
使用ICS的代码
...
procedure TShapeServer.WSocketDataAvailable(Sender: TObject; ErrCode: Word);
...
begin
SrcLen := SizeOf(Src);
stream := TMemoryStream.Create;
stream.SetSize(INT_BUFFER_SIZE);
Inc(fMessageReceived);
try
Len := FUDPServer.ReceiveFrom(stream.Memory, stream.size, Src, SrcLen);
if (FSenderAddr.S_addr = INADDR_ANY) or
(FSenderAddr.S_addr = Src.Sin_addr.S_addr) then
begin
while stream.Position < Len do
begin
try
AMessage := fFormats.ReadFromStream(stream);
DoMessageReceived(Src.Sin_addr, AMessage);
except
break;
end;
end;
end;
finally
stream.Free;
end;
end;
...
Run Code Online (Sandbox Code Playgroud)
Eug*_*its 13
UDP不保证消息传递 - 如果缓冲区中没有位置,则会毫不犹豫地丢弃数据包.如果您需要有保证的交付,请使用TCP并在TCP之上构建基于消息的通信方案.或者使用已有的MsgConnect产品.十字军的注意事项:MsgConnect有一个开源版本.