【问题标题】:Winsock UDP socket receive buffer utilizationWinsock UDP 套接字接收缓冲区利用率
【发布时间】:2014-08-17 16:58:34
【问题描述】:

我已经建立了一个UDP套接字:

receiveSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

然后我修改套接字参数以使用大于默认值的缓冲区(例如 100,000 字节):

bufferSize = 100000;
bufferSizeLen = sizeof(bufferSize);
setsockopt(receiveSocket, SOL_SOCKET, SO_RCVBUF, (char *) &bufferSize, bufferSizeLen);

稍后,我想查询套接字以了解缓冲区中当前存储了多少数据(即有多少数据报正在等待通过调用recv() 来检索)。有没有办法做到这一点?

【问题讨论】:

    标签: c windows sockets winsock


    【解决方案1】:

    使用FIONREAD 选项调用ioctlsocket()

    【讨论】:

    • FIONREAD 告诉下一个recv() 可以读取多少字节,而不是存在多少数据报。您必须循环调用recv(),直到缓冲区为空。
    • @RemyLebeau 你不是在和你在你的回答中所说的相矛盾吗(同样的问题......)? stackoverflow.com/a/16432235/297144
    • 我在 Windows 7 上对此进行了测试,我可以确认 FIONREAD 返回的值是缓冲区中的总字节数,而不仅仅是第一个数据报的大小。我在recvfrom() 上设置了MSG_PEEK 标志,我观察到缓冲区的大小随着数据报的堆积而增加。
    • @RyanEdwards: Read the documentation: "FIONREAD 返回单次调用recv函数可以读取的数据量,可能与队列中排队的数据总量不同socket. 如果 s 是面向消息的(例如 SOCK_DGRAM 类型),FIONREAD 仍然返回网络缓冲区中未决数据的数量,但是,在一次调用 recv 函数中实际可以读取的数量仅限于数据大小写在 send 或 sendto 函数调用中。”
    • 是的,我同意文档似乎反映了现实。您的原始评论 FIONREAD 告诉下一个 recv() 可以读取多少字节,而不是存在多少数据报 似乎与此不符。我在这里错过了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多