首页 > 解决方案 > C# UDP 套接字的 ReceiveBufferSize 是否适用于数据报的大小或消息队列的大小?

问题描述

我有一个托管在天蓝色云上的 C# UDP 套接字,它使用UdpClient.receive. 可能有数千个客户端同时向套接字发送消息,每个客户端发送大小约为 1Kb 的数据报。

我很困惑是否ReceiveBufferSize适用于每个数据报的大小,或者它是否设置了下面的接收队列的大小?接收队列是指.NET 运行时用来将来自不同客户端的UdpClient.receive尚未读取的数据报排入队列的队列。

我在一些帖子中读到ReceiveBufferSize仅适用于单个数据报的大小,如果是这种情况,我们将如何设置下面的接收队列的大小?

我已将其设置ReceiveBufferSize为 65Kb。如果这ReceiveBufferSize适用于后台队列大小,并且每个客户端同时发送一个 1Kb 数据报,这是否意味着套接字只能处理来自 65 个客户端的数据?如果有更多的客户端同时发送缓冲区溢出和数据报丢失?

标签: c#socketsudpbuffer

解决方案


大概你的意思是UdpClient.Client.ReceiveBufferSize,即Socket.ReceiveBufferSize

如果你追赶那个电话,你最终会接到一个电话到setsockopt这里,有SO_RCVBUF选择权。

研究该选项,您最终会从@DS得到这个答案:

SO_RCVBUF更容易理解:它是内核分配的缓冲区大小,用于保存到达给定套接字的数据,在数据通过网络到达与拥有此套接字的程序读取之间的时间。使用 TCP,如果数据到达而您没有读取它,缓冲区将填满,发送方将被告知放慢速度(使用 TCP 窗口调整机制)。对于 UDP,一旦缓冲区已满,新的数据包将被丢弃。

这表明它是与套接字关联的整个队列的大小,即操作系统会将接收到的 UDP 数据报放入供您读取的缓冲区有多大。一旦这已满,额外的数据报将被丢弃。


推荐阅读