Socket.BeginReceive 在使用非阻塞发送 (TCP) 时冻结在高负载上



我有 2 个连接到服务器客户端。每个每秒发送和接收大约 1 MB。有时是服务器套接字。BeginReceive 冻结在 200-300 毫秒。
SendBufferSize = 20 字节。是的,对于此类流量,这不是正确的值。但这不应该是接收冻结的原因。
如果我设置一个更大的 SendBufferSize 值 (1000),冻结就会消失。很难
从我的代码中提取它进行重现。但是你能猜出这种异步接收冻结的可能原因是什么吗?

鉴于您的数据包大小如此之小,您几乎肯定会遇到 Nagle's 算法。在网络堆栈深处的某个地方,您的数据正在被缓冲,以便可以将其组合成更大、大小更合理的数据包,以防止网络拥塞。您可以通过使用 Socket.NoDelay 属性向套接字提供TCP_NODELAY来关闭它,但考虑到 TCP 数据包标头的长度可以是 40 字节,这是很大的开销。

也许 UDP 可能对您的应用程序更有意义。

Is 不会冻结:有时它会同步完成,因此需要一段时间来处理接收到的数据。现在我检查IAsyncResult.CompleteSyncly属性,如果它是真的,则调用QueueUserWorkItem。

最新更新