UDP Server和Client在Delphi中 [英] UDP Server and Client in Delphi

查看:414
本文介绍了UDP Server和Client在Delphi中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在做一个UDP C / S。我对服务器每秒可以接收的数据数量有问题。



我已经测试了向服务器发送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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆