Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winsock UDP套接字接收缓冲区利用率_C_Windows_Sockets_Winsock - Fatal编程技术网

Winsock UDP套接字接收缓冲区利用率

Winsock UDP套接字接收缓冲区利用率,c,windows,sockets,winsock,C,Windows,Sockets,Winsock,我已建立UDP套接字: receiveSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 然后,我修改套接字参数以使用大于默认值的缓冲区(例如100000字节): 稍后,我想查询套接字以了解缓冲区中当前存储了多少数据(即有多少数据报等待通过调用recv())检索)。有办法吗?使用FIONREAD选项调用ioctlsocket()。FIONREAD告诉下一个recv()可以读取多少字节,而不是存在多少数据报。你必须在一个循环中调用recv(),直

我已建立UDP套接字:

receiveSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
然后,我修改套接字参数以使用大于默认值的缓冲区(例如100000字节):


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

使用
FIONREAD
选项调用
ioctlsocket()

FIONREAD
告诉下一个
recv()
可以读取多少字节,而不是存在多少数据报。你必须在一个循环中调用
recv()
,直到缓冲区为空。@RemyLebeau你不是在反驳你在回答(这个问题…)时所说的吗?我已经在Windows 7上对此进行了测试,我可以确认,
FIONREAD
返回的值是缓冲区中的总字节数,而不仅仅是第一个数据报的大小。我在
recvfrom()
上设置了
MSG_PEEK
标志,并观察到缓冲区的大小随着数据报的堆积而增加。@RyanEdwards::“FIONREAD返回在对recv函数的一次调用中可以读取的数据量,这可能与套接字上排队的数据总量不同。如果s是面向消息的(例如,键入SOCK_DGRAM),FIONREAD仍然返回网络缓冲区中的挂起数据量,但是,在对recv函数的单个调用中实际可以读取的数据量仅限于在send或sendto函数调用中写入的数据大小。”是的,我同意文档似乎反映了现实情况。您最初的注释FIONREAD告诉我们下一个recv()可以读取多少字节,而不是存在多少数据报。我这里缺少什么?
bufferSize = 100000;
bufferSizeLen = sizeof(bufferSize);
setsockopt(receiveSocket, SOL_SOCKET, SO_RCVBUF, (char *) &bufferSize, bufferSizeLen);