当我们将read()
函数与文件描述符(不是套接字)一起使用时,它具有这样的字节偏移量。
read(file descriptor, message1, 20);
read(file descriptor, message2, 40);
在number1命令之后,文件描述符的字节偏移量为20。 然后,number 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 }
因此,客户端首先将10字节数据写入服务器的100字节字符串之一。
无论如何,服务器执行read()
函数,读取1024个字节。因此,服务器需要10个字节。但是,它的字节偏移现在是1024。
因此,在客户端的第二个数据(20字节数据)之后,服务器必须以字节偏移量1024读取。然后,服务器如何读取从客户端发送的20个字节?我的意思是,服务器必须在字节偏移10(而不是1024)读取20个字节,因为10字节数据已经在20字节之前发送。但是,服务器的字节偏移量为1024.这怎么可能?
答案 0 :(得分:3)
这个
recv_count=read(cli_sock, message[recv_len], 1024);
不会按你的想法行事。
应该是:
recv_count=read(cli_sock, message + recv_len, 1024 - recv_len);
或
recv_count=read(cli_sock, &message[recv_len], 1024 - recv_len);
阅读手册页,如果不明白,请不要犹豫要求精确度(甚至认为blue112已经解释了所有内容)。
答案 1 :(得分:1)
你错了。 read()调用的第三个参数不是偏移量,它表示要读取的最大字节数。 读取的实际数字由read()调用返回。
请看这里:http://man7.org/linux/man-pages/man2/read.2.html
此外,您应该传递一个指向read()调用的指针。
所以message[recv_len]
不会这样做。您正在寻找message + recv_len