c# - 负载下的 UDP 组播性能

标签 c# udp multicast

我有一个简单的 C# 应用程序,它在单接收方、单发送方场景中使用 UDP 多播。目标是在本地网络环境中尽可能快地传递消息。

我使用过 SocketAsyncEventArgs/SendAsync/ReceiveAsync、BeginSend/BeginReceive、Threads/Send/Receive,并尝试过 PGM 和 UDP 多播。

每次实现尝试都可以通过本地发送和本地接收重复发送最多约 1000 条消息。之后,性能开始呈指数下降。 1000 条消息需要百分之几秒,而 10,000 条消息可能需要 2-10 秒。

有没有人有高性能UDP/PGM多播的经验?获得最大吞吐量的最佳设计是什么?

更新

现在,它只是一个本地运行的程序——1 个应用程序,1 个发送方和 1 个接收方。测试消息为 4 个字节。

最佳答案

尝试使套接字的发送或接收缓冲区(服务器或客户端)足够大以容纳您期望处理的流量。以下是服务器端我自己的 UDP 多播服务器/客户端的一些示例 C# 代码,其中 dataSock 是我绑定(bind)到 UDP 多播组的 Socket:

dataSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, (NumberOfPackets * PacketSize) + SmallEpsilonForExtraHeadroom);

还要确保在客户端设置 SocketOptionName.SendBuffer 以匹配服务器生成的缓冲区大小。

我还建议,如果您还不知道的话,让您的数据包大小小于 MTU。默认情况下,MTU 设置为 1500 字节。 (MTU是最大传输单元大小)

除非您也限制发送速率,以确保您的客户端能够跟上,否则您仍然可能会丢失数据包。您的网络硬件很可能不是这里的瓶颈。看我的问题Need microsecond delay in .NET app for throttling UDP multicast transmission rate寻找该问题的答案(在 while 循环中使用 Stopwatch 以实现微秒级的延迟)。

关于c# - 负载下的 UDP 组播性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1652965/

相关文章:

c# - 如何将列表中的字符串与句子中的单词匹配?

c# - SqlConnection 状态总是在执行时关闭

c# - 通过表单将变量从 Javascript 传递到 C#?

ios - codenameone 多播 udp 的 IOS 权利

elasticsearch - 为 Logstash 启用多播 - Elasticsearch

c# - 如何将 ColorDialog 颜色转换为 KML 颜色格式

c++ - 网络电话 C++ 编程

c++将udp数据流式传输到队列中?

c++ - 多播接收器套接字中的重复数据包

linux - Redhat Enterprise Linux 6 多播提要