Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查文件描述符中可用的缓冲区字符数_C++_Linux_Sockets_Posix - Fatal编程技术网

C++ 检查文件描述符中可用的缓冲区字符数

C++ 检查文件描述符中可用的缓冲区字符数,c++,linux,sockets,posix,C++,Linux,Sockets,Posix,如何检查套接字文件描述符的缓冲区中有多少可用字符 我想推迟从套接字读取字节,直到至少有8个字节可用(以下消息的长度)。我正在使用select()等待传入数据。调用套接字的读取处理程序时,如果可用字节少于8个,我希望它只返回而不读取 套接字是否甚至可以读取,但只能读取少于8个字节 是否有一个Linux系统调用可以检索从套接字读取的可用字节数,而无需实际读取它们?您可以使用FIONREAD(SIOCINQ)请求 从手册页: 以下调用返回值中的信息。正确的语法是: int value; error =

如何检查套接字文件描述符的缓冲区中有多少可用字符

我想推迟从套接字读取字节,直到至少有8个字节可用(以下消息的长度)。我正在使用
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
,等等。