Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
Linux 套接字读取/接收获得的数据长度不确定_Linux_Sockets_Unix - Fatal编程技术网

Linux 套接字读取/接收获得的数据长度不确定

Linux 套接字读取/接收获得的数据长度不确定,linux,sockets,unix,Linux,Sockets,Unix,在TCP连接(SOCK_STREAM,BLOCK socket)中,send()接口发送2726字节的数据,接收器使用read(fd,*recv_buf,10240)接收数据。问题在于,有时read()返回的数据长度为2726字节,有时依次返回1448字节和1278字节(即,发送的数据量被接收两次)。 在这种情况下,可以预测read()的返回值吗?我们希望read()一次返回所有2726字节的数据,而recv()和MSG_WAITALL能解决这个问题吗?您的期望是不正确的。TCP是一种流协议,因

在TCP连接(SOCK_STREAM,BLOCK socket)中,send()接口发送2726字节的数据,接收器使用read(fd,*recv_buf,10240)接收数据。问题在于,有时read()返回的数据长度为2726字节,有时依次返回1448字节和1278字节(即,发送的数据量被接收两次)。
在这种情况下,可以预测read()的返回值吗?我们希望read()一次返回所有2726字节的数据,而recv()和MSG_WAITALL能解决这个问题吗?

您的期望是不正确的。TCP是一种流协议,因此它没有应用程序级msg边界的概念。TCP接收器堆栈不知道您的应用程序希望准确地接收
2726
字节。由应用程序代码确定边界。您可以使用
MSG_WAITALL
,但您需要确切地知道发送方每次发送的信息量,这是不切实际的。您需要在应用程序级别明确定义TCP消息的边界。1)在发送数据之前发送消息的长度,或2)使用消息数据中从未出现的唯一分隔符终止每条消息。然后,接收器可以1)读取长度,然后读取指定的字节数,或2)读取,直到分隔符到达。