当我们将read()
函数与文件描述符(而不是套接字)一起使用时,它具有这样的字节偏移量。read(file descriptor, message1, 20);
read(file descriptor, message2, 40);
在number1命令之后,文件描述符的字节偏移为20。
然后,数字2命令以字节偏移量20读取文件,文件描述符的最终偏移量现在为60。
所以,现在我的问题是关于套接字的。让我为您解释情况。
在服务器-客户端模型上,客户端向服务器发送100字节(假设是字符串数据)。但是,不幸的是,服务器按顺序接收10、20、70(不是一次发送100个字节)的数据。
因此,由于这种情况,服务器源代码就是这样。
51 while(recv_len<100)
52 {
53 recv_count=read(cli_sock, message[recv_len], 1024);
54
55 if(recv_count==-1)
56 error_handling("read() error");
57
58 recv_len+=recv_count;
59 }
因此,客户端首先将100字节字符串之一的10字节数据写入服务器。
无论如何,服务器执行
read()
函数,并读取1024个字节。因此,服务器占用10个字节。但是,它的字节偏移现在是1024。因此,在客户机的第二个数据(20字节数据)之后,服务器必须读取字节偏移量1024。然后,服务器如何读取客户机发送的20字节?我的意思是最初,服务器必须以字节偏移量10(而不是1024)读取20个字节,因为在20个字节之前发送了10个字节的数据。但是,服务器的字节偏移量为1024。这怎么可能?
最佳答案
你错了。 read()调用的第三个参数不是偏移量,它表示要读取的最大字节数。
读取的实际数字由read()调用返回。
看这里:http://man7.org/linux/man-pages/man2/read.2.html
另外,您应该将指针传递给read()调用。
所以message[recv_len]
不会。您正在寻找message + recv_len