如何在 Winsock 中查找当前使用的 UDP 接收缓冲区大小

Posted

技术标签:

【中文标题】如何在 Winsock 中查找当前使用的 UDP 接收缓冲区大小【英文标题】:How to find currently used size of UDP receive buffer in Winsock 【发布时间】:2014-04-08 12:41:23 【问题描述】:

我有一个处于阻塞模式的 UDP 套接字,我有大量的数据包,有些正在丢失。

    如何在 winsock 的接收缓冲区中找出当前使用的大小? 如何了解系统是否在丢弃数据包?

【问题讨论】:

如何知道您是否正在丢弃数据包取决于您在 UDP 之上使用的应用层协议。这是什么? @JohnZwinck,我正在通过 WinSock2 使用数据报套接字。 对,协议是什么?例如,它可能是一些 VoIP 协议,或视频游戏协议,或者......?我们需要知道 UDP 之上的分层是什么,因为如果有序列号,那应该是序列号所在的位置。 嗯,好的。它是一种专有协议,类似于 RTP。它内部有序列号,并使用该序列号检测数据包丢失。但是,我怎么知道它是实际丢失还是丢弃的数据包? “实际丢失”和“丢弃数据包”有什么区别? 【参考方案1】:

WSAIoctl 传递的 FIONREAD 以这种方式记录:

如果 s 参数中传递的套接字是面向消息的(对于 例如,键入 SOCK_DGRAM),FIONREAD 返回报告总数 可读取的字节数,而不是第一个数据报的大小 (消息)在套接字上排队。

我认为这回答了您的第一个问题。至于第二个,我认为没有办法以编程方式解决这个问题。您应该在应用程序中使用序列号来检测间隙,然后查看接收缓冲区大小并猜测如果接近满,则损失是由于缓冲区空间不足造成的。

【讨论】:

【参考方案2】:

任何套接字的接收缓冲区大小是通过使用 SO_RCVBUF 选项调用 getsockopt() 来给出的

我看不出如何在接收方区分网络中丢失的数据包和本地主机丢弃的数据包。你只能说它没有到达,你需要一个比 UDP 更高级别的协议来告诉你,一个带有 ACK 或 NACK 的序列号协议。

【讨论】:

抱歉,我的问题不清楚。我对总缓冲区大小感兴趣,但对当前使用的缓冲区大小感兴趣。

以上是关于如何在 Winsock 中查找当前使用的 UDP 接收缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

VB6.0的winsock控件用UDP局域网广播数据,当数据很大时接收方报10040--数据包太大,请问怎么处理。

UDP 打孔 (c++/winsock)

用WinSock API接收UDP消息时,可不可以设置接收Buffer?如何设置

Winsock 错误 10054 (WSAECONNRESET) 与 UDP 到/来自本地主机的“正常”吗?

VB如何使用Winsock进行1对多通信

环回中的 WinSock UDP 套接字创建顺序。