dic*_*oce 1 select libc blocking
我可以用来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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
ioctl 调用应该适用于套接字和其他一些 fd,但不是所有 fd。我相信它可以在您可能使用的几乎任何免费的类 UNIX 操作系统上与 TCP 套接字配合良好。对于 UDP 套接字,它的语义有点不同:对于它们来说,它告诉您下一个数据报中的字节数。
Windows 上的 ioctlsocket 调用(显然)仅适用于套接字。