UDP Server和Client在Delphi中 [英] UDP Server and Client in Delphi
问题描述
我已经测试了向服务器发送10,100,1000个数据消息的批量,10,100收到没有问题。发送1000时,只收到300〜400。所有测试都在本地完成。
我已尝试使用ICS的twsocket和Synapse的tudpblocksocket实现服务器。两个都是同样的问题上面。
可以解释为什么会发生这种情况,以及如何提高服务器性能。
使用TUDPBlockSocket的代码
...
而不是终止do
begin
try
sz:= FUDPServer.WaitingData;
如果sz> 0然后
begin
FUDPServer.RecvBuffer(mem.Memory,sz);
mem.Seek(0,0);
AMessage:= fFormats.ReadFromStream(mem);
DoMessageReceived(FUDPServer.RemoteSin.sin_addr,AMessage);
结束
finally
end;
结束
...
使用ICS的代码
...
程序TShapeServer.WSocketDataAvailable(发件人: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)或
(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);
除了
break;
结束
结束
end;
finally
stream.Free;
结束
结束
...
UDP不保证消息传递 - 如果缓冲区中没有地方,数据包将毫不犹豫地丢弃。
如果您需要保证交付,请使用TCP并在TCP之上构建基于消息的通信方案。或使用已经拥有它的 MsgConnect 产品。十字军注意事项:MsgConnect有一个开源版本。
I am making a UDP C/S. I am having a problem with number of data the server can receive per second.
I have tested sending batches of 10, 100, 1000 data messages to the server, 10, 100 received without a problem. when sending 1000, only 300 ~ 400 received. All tests done on locally.
I have tried implement the server using both ICS's twsocket and Synapse's tudpblocksocket. Both turned out with same problem above.
Could any explain to me why this happens, and how could I improve the server performance.
Code using 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;
...
Code using 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 doesn't guarantee message delivery - if there's no place in the buffer, the packet is dropped without hesitation. If you need guaranteed delivery, use TCP and build a message-based communication scheme on top of TCP. Or use our MsgConnect product which already has it. Note for crusaders: MsgConnect has an open-source version.
这篇关于UDP Server和Client在Delphi中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!