Delphi中的UDP服务器和客户端 [英] UDP Server and Client in Delphi

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

问题描述

我正在制作一个 UDP C/S.我对服务器每秒可以接收的数据数量有疑问.

I am making a UDP C/S. I am having a problem with number of data the server can receive per second.

我已经测试了将 10、100、1000 条数据消息批量发送到服务器,10、100 条接收没有问题.发送 1000 个时,只收到 300 ~ 400 个.所有测试都在本地完成.

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.

我尝试使用 ICS 的 twsocket 和 Synapse 的 tudpblocksocket 来实现服务器.两者都出现了上述相同的问题.

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.

使用 TUDPBlockSocket 的代码

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;

...

使用 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 有一个开源版本.

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.

这篇关于Delphi中的UDP服务器和客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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