C++ 检查文件描述符中可用的缓冲区字符数
如何检查套接字文件描述符的缓冲区中有多少可用字符 我想推迟从套接字读取字节,直到至少有8个字节可用(以下消息的长度)。我正在使用C++ 检查文件描述符中可用的缓冲区字符数,c++,linux,sockets,posix,C++,Linux,Sockets,Posix,如何检查套接字文件描述符的缓冲区中有多少可用字符 我想推迟从套接字读取字节,直到至少有8个字节可用(以下消息的长度)。我正在使用select()等待传入数据。调用套接字的读取处理程序时,如果可用字节少于8个,我希望它只返回而不读取 套接字是否甚至可以读取,但只能读取少于8个字节 是否有一个Linux系统调用可以检索从套接字读取的可用字节数,而无需实际读取它们?您可以使用FIONREAD(SIOCINQ)请求 从手册页: 以下调用返回值中的信息。正确的语法是: int value; error =
select()
等待传入数据。调用套接字的读取处理程序时,如果可用字节少于8个,我希望它只返回而不读取
套接字是否甚至可以读取,但只能读取少于8个字节
是否有一个Linux系统调用可以检索从套接字读取的可用字节数,而无需实际读取它们?您可以使用FIONREAD
(SIOCINQ
)请求
从手册页:
以下调用返回值中的信息。正确的语法是:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
int value;
error = ioctl(udp_socket, ioctl_type, &value);
ioctl\u类型是以下类型之一:
SIOCINQ
返回接收缓冲区中排队的未读数据量。套接字不能处于侦听状态,否则将返回错误(EINVAL)。SIOCINQ在中定义。或者,您可以使用中定义的同义FIONREAD
从手册页:
可以使用访问这些IOCTL。正确的语法是:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
int value;
error = ioctl(udp_socket, ioctl_type, &value);
FIONREAD(SIOCINQ)
获取指向整数的指针作为参数。返回下一个挂起数据报的大小(以字节为单位),如果没有挂起数据报,则返回0。警告:使用FIONREAD,无法区分没有挂起数据报的情况和下一个挂起数据报包含零字节数据的情况。使用或区分这些情况更安全
只要套接字的接收缓冲区在TCP中至少包含1个字节,或在UDP中至少包含1个数据报,则套接字将处于可读状态。或者,在TCP的情况下,如果对等方已正常关闭连接(接收到FIN
数据包),在这种情况下,后续读取将报告0字节。您可以使用FIONREAD
(SIOCINQ
)请求
从手册页:
以下调用返回值中的信息。正确的语法是:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
int value;
error = ioctl(udp_socket, ioctl_type, &value);
ioctl\u类型是以下类型之一:
SIOCINQ
返回接收缓冲区中排队的未读数据量。套接字不能处于侦听状态,否则将返回错误(EINVAL)。SIOCINQ在中定义。或者,您可以使用中定义的同义FIONREAD
从手册页:
可以使用访问这些IOCTL。正确的语法是:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
int value;
error = ioctl(udp_socket, ioctl_type, &value);
FIONREAD(SIOCINQ)
获取指向整数的指针作为参数。返回下一个挂起数据报的大小(以字节为单位),如果没有挂起数据报,则返回0。警告:使用FIONREAD,无法区分没有挂起数据报的情况和下一个挂起数据报包含零字节数据的情况。使用或区分这些情况更安全
只要套接字的接收缓冲区在TCP中至少包含1个字节,或在UDP中至少包含1个数据报,则套接字将处于可读状态。或者,在TCP的情况下,如果对等方正常关闭了连接(接收到FIN
数据包),在这种情况下,后续读取将报告0字节。使用FIONREAD
ioctl。最简单的方法是使用缓存缓冲区读取套接字数据,并在有足够数据时从那里进行处理。在TCP中,只可能从附加到前一条消息的新消息中获取几个字节,因为TCP在流中发送字节,但分块。使用FIONREAD
ioctl。最简单的方法是使用缓存缓冲区读取套接字数据,并在有足够的数据时从中进行处理。在TCP中,只可能从附加到前一条消息的新消息中获取几个字节,因为TCP在流中发送字节,但被分块。谢谢!一个问题。。。您说过,如果正常关闭连接,它将返回0。如果连接由于TCP超时而关闭,它是否仍将返回0?@Anonymous1847读取超时不会关闭TCP连接(但TCP keepalive超时将使连接无效)。但否,超时不会使读取返回0。超时是一种实际的错误情况,因此读取将返回-1,并相应地设置errno
,例如ETIMEDOUT
,ECONNRESET
,等等。谢谢!一个问题。。。您说过,如果正常关闭连接,它将返回0。如果连接由于TCP超时而关闭,它是否仍将返回0?@Anonymous1847读取超时不会关闭TCP连接(但TCP keepalive超时将使连接无效)。但否,超时不会使读取返回0。超时是一种实际的错误情况,因此读取将返回-1,并相应地设置errno
,例如ETIMEDOUT
,ECONNRESET
,等等。