socket read()的字节偏移量(linux)

时间:2016-02-22 15:59:12

标签: c linux sockets networking

当我们将read()函数与文件描述符(不是套接字)一起使用时,它具有这样的字节偏移量。

  1. read(file descriptor, message1, 20);
  2. read(file descriptor, message2, 40);
  3. 在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.这怎么可能?

2 个答案:

答案 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