C++ 带FIONREAD返回值的ioctl
这个问题与 我尝试在Mac上使用下一个代码: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
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
标志来接收消息并将其从接收缓冲区中删除