gpt4 book ai didi

delphi - Delphi中的UDP服务器和客户端

转载 作者:行者123 更新时间:2023-12-03 14:46:13 25 4
gpt4 key购买 nike

我正在制作一个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;

...

使用 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;
...

最佳答案

UDP 不保证消息传送 - 如果缓冲区中没有位置,数据包将被毫不犹豫地丢弃。如果您需要有保证的交付,请使用 TCP 并在 TCP 之上构建基于消息的通信方案。或者使用我们的MsgConnect已经拥有它的产品。十字军注意:MsgConnect 有一个开源版本。

关于delphi - Delphi中的UDP服务器和客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com