结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)

The results are different ; recv(sock,buf,sizeof(buf),0) and strlen(buf) in c++

本文关键字:buf 结果是 sizeof strlen 是不同 中的 C++ recv 结果 sock      更新时间:2023-10-16

这是我的代码。

char buf[5000];
bool isHandshaking = false;
bool isSingaling = false;
while(1)
{
    //-----------클라이언트로부터 수신------------
    int recvsize = recv(sock,buf,sizeof(buf),0);
    printf("recvsize = %dn",recvsize);
    buf[recvsize] = '';
    printf("buf_len = %dn",strlen(buf));
    .
    .
    .
}

以上结果...

recvsize = 2525
buf_len = 126 /*(or different value, sometimes 2525)*/

回复值为 2525我预计 buf 的 strlen 值当然会等于 recvsize。但是 bufsize 有时等于 2525,但有时却不一样。我错过了什么?

这意味着接收到的数据中有一个空字节(这意味着您可能不应该一开始就将其视为文本数据,它显然是二进制数据(。 recv()收到 2525 个字节,但位于索引 126 的字节0x00strlen()在遇到的第一个''字符时停止计数。

您还存在潜在的缓冲区溢出。如果recv()碰巧接收到sizeof(buf)字节数,则表示您将 NULL 终止符写入数组的边界之外。 您需要请求sizeof(buf)-1字节。否则,根本不要在 buf 中插入 NULL 终止符。不要将其视为以 null 结尾的文本,因为它在技术上是任意数据,并且确实使用 recv() 返回的值来了解buf实际包含多少字节。