【发布时间】:2010-10-13 17:29:50
【问题描述】:
我可以使用 select() 来确定对 recv() 的调用是否会阻塞,但是一旦我确定它们是要读取的字节,它们是一种在我实际之前查询当前可用字节数的方法调用recv()?
【问题讨论】:
我可以使用 select() 来确定对 recv() 的调用是否会阻塞,但是一旦我确定它们是要读取的字节,它们是一种在我实际之前查询当前可用字节数的方法调用recv()?
【问题讨论】:
如果您的操作系统提供(并且大多数都提供),您可以使用 ioctl(..,FIONREAD,..):
int get_n_readable_bytes(int fd) {
int n = -1;
if (ioctl(fd, FIONREAD, &n) < 0) {
perror("ioctl failed");
return -1;
}
return n;
}
Windows 提供了一个类似的 ioctlsocket(..,FIONREAD,..),它需要一个指向 unsigned long 的指针:
unsigned long get_n_readable_bytes(SOCKET sock) {
unsigned long n = -1;
if (ioctlsocket(sock, FIONREAD, &n) < 0) {
/* look in WSAGetLastError() for the error code */
return 0;
}
return n;
}
ioctl 调用应该在套接字和其他一些 fd 上工作,尽管不是在所有 fd 上。我相信它几乎可以在您可能使用的任何免费的类 unix 操作系统上与 TCP 套接字一起工作。对于 UDP 套接字,它的语义略有不同:对于它们,它告诉您下一个数据报中的字节数。
Windows 上的 ioctlsocket 调用将(显然)仅适用于套接字。
【讨论】:
不,协议需要确定这一点。例如:
【讨论】: