Delphi中的UDP服务器和客户端

Dar*_*tar 8 sockets delphi udp

我正在制作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;
Run Code Online (Sandbox Code Playgroud)

...

使用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;
...
Run Code Online (Sandbox Code Playgroud)

Eug*_*its 13

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

  • 对于过度热心的垃圾邮件标记:并非每个营利性产品的链接都是垃圾邮件.这篇文章符合[自我推广](http://stackoverflow.com/faq#promotion)常见问题解答中提到的所有指南. (17认同)
  • @Rob是什么原因?即使你可以创建一个巨大的缓冲区(并且你不能,你也不能保证在较重的负载下缓冲区大小就足够了.在这种情况下,数据包丢失会导致难以跟踪的错误.所以它更好不要使用"有缺陷"(用于这个具体目的)架构 (3认同)
  • @Darkerstar你是开发局域网还是互联网的应用程序?对于Internet,问题是每个路由器也有各种缓冲区,数据丢失会更频繁地发生. (2认同)
  • @Darkerstar然后我建议你在投入更多时间进入这个架构之前立即进行性能测试.可能是损失率在现实生活中变得不可接受. (2认同)