【发布时间】:2011-05-20 13:35:46
【问题描述】:
我正在制作一个 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;
...
【问题讨论】:
-
你能用wireshark记录环回udp流量吗(在Windows上它与winpcap一起工作)?
-
我还会研究微软每秒数据包的“安全”限制。 IIRC,tcpip.sys 向事件日志报告了上限操作
-
我试过wireshark。不确定是否做错了,但有环回适配器供我选择。 :( 很棒的工具。