Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
C++ 带FIONREAD返回值的ioctl_C++_Sockets_Berkeley Sockets - Fatal编程技术网

C++ 带FIONREAD返回值的ioctl

C++ 带FIONREAD返回值的ioctl,c++,sockets,berkeley-sockets,C++,Sockets,Berkeley Sockets,这个问题与 我尝试在Mac上使用下一个代码: if( ioctl(socketId, FIONREAD, &totalPending) == -1 ) { printf("%d", totalPending); } numBytesRecv = recvfrom(socketId, buffer, maxLen, 0, socketAddress, &socketAddressLen); 在numBytesRecv!=0,numBytesRecv==totalPend

这个问题与

我尝试在Mac上使用下一个代码:

if( ioctl(socketId, FIONREAD, &totalPending) == -1 )
{
    printf("%d", totalPending);
}

numBytesRecv = recvfrom(socketId, buffer, maxLen, 0, socketAddress, &socketAddressLen);
numBytesRecv!=0
numBytesRecv==totalPending-16


你能解释一下为什么会这样吗?这个返回值正确吗?如果是,我是否可以假设每个值的
numbytes-recov==totalPending-16
0?

根据对的回答,Mac上的FIONREAD返回套接字接收缓冲区中所有可用数据的大小,而不是下一条挂起消息的大小
recvfrom()
只报告所接收消息的有效负载大小。因此,您可能看到的只是
FIONREAD
报告套接字接收缓冲区中与下一个挂起消息之后的消息相关的额外字节。如果您需要知道下一条挂起消息的大小,请使用
FIONREAD
了解何时调用
recvfrom()
,但不要依赖
FIONREAD
来告诉您消息的实际大小。相反,使用
MSG_PEEK
标志和大数据缓冲区调用
recvfrom()
。返回值将告诉您消息大小。然后,您可以再次调用
recvfrom()
,而不使用
MSG_PEEK
标志来接收消息并将其从接收缓冲区中删除。

根据对的回答,Mac上的
FIONREAD
返回套接字接收缓冲区中所有可用数据的大小,而不是下一条挂起消息的大小
recvfrom()
只报告所接收消息的有效负载大小。因此,您可能看到的只是
FIONREAD
报告套接字接收缓冲区中与下一个挂起消息之后的消息相关的额外字节。如果您需要知道下一条挂起消息的大小,请使用
FIONREAD
了解何时调用
recvfrom()
,但不要依赖
FIONREAD
来告诉您消息的实际大小。相反,使用
MSG_PEEK
标志和大数据缓冲区调用
recvfrom()
。返回值将告诉您消息大小。然后,您可以再次调用
recvfrom()
,而不使用
MSG_PEEK
标志来接收消息并将其从接收缓冲区中删除