recv缓冲区不匹配返回字节

时间:2010-02-03 23:01:39

标签: sockets

recv套接字调用缓冲区是否可能与调用返回的字节数不匹配?例如:

const int len = 1024;
char buf[len];
int bytes = recv(socket, buf, len, 0);

这不应该是真的:strlen(buf) = bytes

感谢

EDIT1:

我应该注意,我知道recv可以返回小于缓冲区的分配大小。我试图在recv调用后测量缓冲区中的字节数。这不是二进制消息。感谢。

6 个答案:

答案 0 :(得分:8)

strlen仅计入(不包括)第一个'\0'recv返回的数据可能包含多个'\0'个字符 - 或者根本没有。所以总的来说,它不会是真的 - 如果它永远存在,那将是巧合。

<强>附录:

即使有保证的“非二进制”消息,recvstrlen仍在计算不同的内容。假设您收到字符串“foobar” - recv会将字符'f' 'o' 'o' 'b' 'a' 'r' '\0'放入缓冲区并返回7,并且在结果上调用strlen将返回6。

另请注意,在这种情况下,因为recv可以返回一个短值,结果甚至不能保证是一个有效的字符串 - 比如recv决定只给你3个字符:然后它将'f' 'o' 'o'放入缓冲区并返回3.在此上调用strlen会得到一个不确定的结果,因为recv没有写一个字符串终止符。

答案 1 :(得分:2)

我觉得我还在遗漏一些东西...... bytes告诉你缓冲区中有多少字节(或者是否存在套接字错误),为什么还要烦扰strlen或任何其他额外测试?

可以测试你的数据如果1)你知道(不知何故)你收到的数据总是以某个定义的字节集结束; 2)通过在缓冲区中搜索该特定字节集,这些字节不可能出现在其余数据中。没有这些条件,除了检查bytes的价值之外,没有办法知道......

答案 2 :(得分:1)

strlen()需要一个字符串,因此在调用strlen之前你必须先终止缓冲区。 如果您正在接收二进制数据,请不要使用strlen。

答案 3 :(得分:1)

不知道使用什么语言,什么库以及具体情况 - 我会说它不等待填满整个缓冲区直到它返回为止是非常合理的。

答案 4 :(得分:0)

不,recv调用可能返回的字节数少于缓冲区的大小。你也不应该在缓冲区上使用strlen,因为发送给你的任何字节都不能为空终止。

答案 5 :(得分:0)

你似乎使用C。

您无法使用strlen

来确定字节数组的大小

另外,当没有其他东西可以接收时,recv命令返回,因此它是完全正常的行为

编辑:

您不必计算字节数,int字节将保存字节数组中的字节数