我有一个托管在 Azure 云上的 C# UDP 套接字,它使用UdpClient.receive
接收 UDP 数据报。可能有数千个客户端同时向套接字发送消息,每个客户端发送大小约为 1Kb 的数据报。
我对ReceiveBufferSize
是否适用于每个数据报的大小或是否设置下面接收队列的大小感到困惑?通过接收队列,我指的是 .NET 运行时用来对来自不同客户端的数据报进行排队的队列,UdpClient.receive
尚未读取。
我在一些帖子中读到,ReceiveBufferSize
仅适用于单个数据报的大小,如果是这种情况,我们将如何在下面设置接收队列的大小?
我已将ReceiveBufferSize
设置为 65Kb。如果ReceiveBufferSize
适用于后台的队列大小,并且每个客户端同时发送一个 1Kb 的数据报,这是否意味着套接字只能处理来自 65 个客户端的数据?如果同时发送更多客户端,缓冲区溢出并且数据报丢失?
大概你的意思是UdpClient.Client.ReceiveBufferSize
,即Socket.ReceiveBufferSize
?
如果你追着那个电话,你最终会在这里打电话setsockopt
,SO_RCVBUF
选项。
研究该选项,您最终会得到@DS的答案:
SO_RCVBUF
更简单理解:它是内核分配的缓冲区的大小,用于保存从数据到达网络到拥有此套接字的程序读取之间的时间到达给定套接字的数据。使用 TCP,如果数据到达并且您没有读取它,缓冲区将填满,并且发送方将被告知放慢速度(使用 TCP 窗口调整机制(。对于 UDP,一旦缓冲区已满,新数据包将被丢弃。
这表明它是与套接字关联的整个队列的大小,即操作系统将收到的UDP数据报放入其中供您读取的缓冲区有多大。一旦填满,其他数据报将被丢弃。