1

在 ubuntu 12.04 中,我想写一个并发服务器,它可以从我的虚拟机接收 http 数据包,然后将数据包转发到我的虚拟机的原始目的地。但是当我在 C 语言中使用 read 函数读取数据包时,有时返回值和缓冲区的长度不一样(例如: rbyte=1024, strlen(buf)=62 )。我检查了errno,发现errno=0,这意味着read函数没有错误。我认为这两个变量应该是完全一样的,但是对于我的程序来说,它们不是。以下是我的代码的一部分:

char buf[1024];
size_t rbyte = read(sFrom, buf, sizeof(buf) );
cerr << "length of buf: " << strlen(buf) << "\n";
cerr << "rbyte: " << rbyte << "\n";

我已阅读http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html以获得一些线索,但仍然不知道此错误的原因。

有谁知道原因?

4

2 回答 2

4

正如链接文档所述,read读取字节而不是字符串,因此如果输入包含零字节,您将得到一个小于读取字节数的字符串(请记住,C 使用以空字符结尾的字符串),这意味着第一个空字符决定了字符串的结尾——因此也决定了字符串的长度)

于 2012-05-21T17:29:47.127 回答
3

这不是错误。的第三个参数read()表示可以读取的最大字节数。在达到第三个参数的大小之前它不会阻塞。

的返回指示请求read()时缓冲区中有多少字节。read()

您应该在未读取“n”字节(n = 您的消息大小)时执行循环。或直到read()返回 0(对于同步消息)。

提示:如果你写(客户端)空终止字符串,在服务器端你可以做一个fdopen()套接字描述符并使用fgets()(流缓冲区),它会阻塞你的代码,直到一个'\ 0'。

于 2012-05-21T18:55:01.370 回答