read 函数的返回值和缓冲区的长度不一样,C 语言,ubuntu 12.04



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

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 以获取一些线索,但仍然不知道此错误的原因。

有谁知道原因吗?

正如链接的文档所述,read读取的是字节,而不是字符串,所以如果输入连接零字节,你会得到一个小于读取字节数的字符串(记住,C 使用以 null 结尾的字符串(,这意味着第一个空字符决定了字符串的结尾——从而决定了长度(

这不是

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

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

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

提示:如果您编写(客户端(以 null 结尾的 strig,则可以在服务器端对套接字描述符执行fdopen()并使用 fgets()(流缓冲区(,它会阻止您的代码,直到出现"\0"。

最新更新