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

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

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

【问题讨论】:

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

标签: c++ networking udp winsock


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 抱歉,我的问题不清楚。我对总缓冲区大小感兴趣,但对当前使用的缓冲区大小感兴趣。
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多