【问题标题】:recv buffer not matching return bytesrecv 缓冲区与返回字节不匹配
【发布时间】:2011-01-12 20:41:56
【问题描述】:

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

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

这不应该总是正确的吗:strlen(buf) = bytes

谢谢

编辑1:

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

【问题讨论】:

    标签: sockets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        不知道什么语言,什么库以及环境是什么 - 我会说它不会等到它返回才填满整个缓冲区是非常合理的。

        【讨论】:

        • 它是 c。图书馆是winsock。在 recv 返回后调用 strlen(buf)。我不明白您如何将 strlen(buf) 与字节进行比较。所以,你最后的评论没有多大意义,但是谢谢。
        • "如果没有发生错误,recv返回接收到的字节数,buf参数指向的缓冲区将包含接收到的数据。如果连接已经优雅关闭,返回值为零。 " - msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
        【解决方案4】:

        strlen 只计入(不包括)第一个'\0'recv 返回的数据可能有几个 '\0' 字符 - 或者根本没有。所以总的来说,这不会是真的——如果是真的,那也只是巧合。

        附录:

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

        还要注意,在这种情况下,因为 recv 可以返回一个短值,所以结果甚至不能保证是一个有效的字符串——比如 recv 决定只给你 3 个字符:那么它将把 @987654332 @ 进入缓冲区并返回 3。对此调用 strlen 将给出不确定的结果,因为 recv 没有写入字符串终止符。

        【讨论】:

          【解决方案5】:

          你似乎在使用 C。

          你不能用 strlen 测量字节数组的大小

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

          编辑:

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

          【讨论】:

          • 是的,我意识到当没有其他东西可以接收时它正在返回。缓冲区大于预期的味精。如何测量字节数组的大小?
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2012-04-04
            • 2015-06-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多