【问题标题】:socket read()'s byte offset (linux)套接字读取()的字节偏移量(linux)
【发布时间】:2016-02-22 15:59:12
【问题描述】:

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

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

【问题讨论】:

  • 为什么你认为这是一个偏移量?它是您要读取的字节数。

标签: c linux sockets networking


【解决方案1】:

这个

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 已经解释了一切)。

【讨论】:

  • 是的。我更喜欢第二个版本 - 它使指针算术不那么明显:)
【解决方案2】:

你错了。 read() 调用的第三个参数不是偏移量,它表示您要读取的最大字节数。 实际读取的数字由 read() 调用返回。

看这里:http://man7.org/linux/man-pages/man2/read.2.html


此外,您应该传递一个指向 read() 调用的指针。

所以message[recv_len] 不行。你正在寻找message + recv_len

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2012-01-06
    • 2016-04-22
    • 1970-01-01
    • 2013-11-14
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多