recv套接字调用缓冲区是否可能与调用返回的字节数不匹配?例如:
const int len = 1024;
char buf[len];
int bytes = recv(socket, buf, len, 0);
这不应该是真的:strlen(buf) = bytes
?
感谢
EDIT1:
我应该注意,我知道recv可以返回小于缓冲区的分配大小。我试图在recv调用后测量缓冲区中的字节数。这不是二进制消息。感谢。
答案 0 :(得分:8)
strlen
仅计入(不包括)第一个'\0'
。 recv
返回的数据可能包含多个'\0'
个字符 - 或者根本没有。所以总的来说,它不会是真的 - 如果它永远存在,那将是巧合。
<强>附录:强>
即使有保证的“非二进制”消息,recv
和strlen
仍在计算不同的内容。假设您收到字符串“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字节将保存字节数组中的字节数