Sockets recv缓冲区与返回字节不匹配

Sockets recv缓冲区与返回字节不匹配,sockets,Sockets,recv套接字调用的缓冲区是否可能与调用返回的字节数不匹配?例如: const int len = 1024; char buf[len]; int bytes = recv(socket, buf, len, 0); strlenbuf=bytes,这不应该一直是真的吗 谢谢 编辑1: 我应该注意,我知道recv返回的值可能小于分配的缓冲区大小。我试图在recv调用后测量缓冲区中的字节数。这不是二进制消息。谢谢。否,recv呼叫返回的字节数可能小于缓冲区大小。您也不应该在缓冲区上使用strl

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

const int len = 1024;
char buf[len];
int bytes = recv(socket, buf, len, 0);
strlenbuf=bytes,这不应该一直是真的吗

谢谢

编辑1:


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

否,recv呼叫返回的字节数可能小于缓冲区大小。您也不应该在缓冲区上使用strlen,因为发送给您的任何字节都不能以null结尾。

否,recv调用返回的字节可能少于缓冲区的大小。您也不应该在缓冲区上使用strlen,因为发送给您的任何字节都可能不会以null结尾。

strlen需要一个字符串,因此您必须在调用strlen之前以nul结尾缓冲区。
如果您正在接收二进制数据,请不要使用strlen。

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

不知道什么语言、什么库以及情况是什么-我想说,它不必等到返回时才填满整个缓冲区,这是非常合理的。

不知道什么语言,什么库和情况是什么-我想说,它不等待填充整个缓冲区,直到它返回,这是非常合理的。

strlen只计算第一个'\0',不包括第一个'\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没有写入字符串终止符。

strlen只计算第一个'\0',不包括第一个'\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没有编写字符串终止符。

您似乎使用了C

无法使用strlen测量字节数组的大小

此外,recv命令在没有其他内容可接收时返回,因此这是完全正常的行为

编辑:

您不必计算字节数,int bytes将保存字节数组中的字节数,您似乎在使用C

无法使用strlen测量字节数组的大小

此外,recv命令在没有其他内容可接收时返回,因此这是完全正常的行为

编辑:


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

我觉得我仍然缺少一些东西…bytes告诉您缓冲区中有多少字节,或者是否存在套接字错误,那么为什么还要麻烦使用strlen或任何其他额外的测试呢


你可以测试你的数据,如果你知道你接收的数据总是以一组特定的字节结束;通过在缓冲区中搜索特定的字节集,这些字节不可能出现在其余的数据中。如果没有这些条件,除了检查字节的值之外,没有办法知道…我觉得我仍然缺少一些东西…字节告诉您缓冲区中有多少字节,或者是否有套接字错误,那么为什么还要麻烦使用strlen或任何其他额外的测试呢


你可以测试你的数据,如果你知道你接收的数据总是以一组特定的字节结束;通过在缓冲区中搜索特定的字节集,这些字节不可能出现在其余的数据中。如果没有这些条件,除了检查字节的值之外,没有办法知道。

这是c。库是winsock。在recv返回后调用strlenbuf。我不明白
以及如何将strlenbuf与字节进行比较。因此,您的最后一条评论没有多大意义,但非常感谢。如果没有发生错误,recv将返回接收到的字节数,buf参数指向的缓冲区将包含接收到的数据。如果连接已正常关闭,则返回值为零。-是c。库是winsock。在recv返回后调用strlenbuf。我不明白你怎么会把strlenbuf和bytes做比较。因此,您的最后一条评论没有多大意义,但非常感谢。如果没有发生错误,recv将返回接收到的字节数,buf参数指向的缓冲区将包含接收到的数据。如果连接已正常关闭,则返回值为零。-是的,我意识到当没有其他东西可以接收时,它正在返回。缓冲区大于预期的消息。如何测量字节数组的大小?是的,我意识到当没有其他东西可以接收时,它会返回。缓冲区大于预期的消息。如何测量字节数组的大小?