如何检查套接字文件描述符的缓冲区中有多少可用字符?
我想推迟从套接字读取字节,直到至少有8个字节可用(对于以下消息的长度(。我正在使用select()
来等待传入数据。当调用套接字的读取处理程序时,如果可用字节少于8个,我希望它只返回而不读取。
套接字是否可以读取,但只能读取小于8个字节的内容?
有没有一个Linux系统调用可以在不实际读取的情况下检索可从套接字读取的字节数?
您可以将ioctl()
与FIONREAD
(SIOCINQ
(请求一起使用。
来自tcp(7(手册页:
以下ioctl(2(调用返回
value
中的信息。正确的语法是:int value; error = ioctl(tcp_socket, ioctl_type, &value);
ioctl_type
是以下之一:SIOCINQ
返回接收缓冲区中排队的未读数据量。套接字不能处于LISTEN状态,否则将返回错误(EINVAL(。SIOCINQ在<linux/sockios.h>。或者,您可以使用同义词FIONREAD,在<sys/iotl.h>。
来自udp(7(手册页:
可以使用ioctl(2(访问这些ioctl。正确的语法是:
int value; error = ioctl(udp_socket, ioctl_type, &value);
FIONREAD(SIOCINQ(
获取一个指向整数的指针作为参数。返回下一个挂起数据报的大小(以字节为单位的整数(,或者当没有数据报挂起时返回0。警告:使用FIONREAD,无法区分没有数据报挂起的情况和下一个挂起的数据报包含零字节数据的情况。使用select(2(、poll(2(或epoll(7(来区分这些情况更安全。
只要套接字的接收缓冲区在TCP中至少包含1个字节,或在UDP中包含1个数据报,套接字就会处于可读状态。或者,在TCP的情况下,如果对等方已正常关闭连接(接收到FIN
数据包(,在这种情况下,后续读取将报告0字节。