结果不同;在c ++中recv(sock,buf,sizeof(buf),0)和strlen(buf)

时间:2017-04-01 19:03:35

标签: c++

这是我的代码..

char buf[5000];
bool isHandshaking = false;
bool isSingaling = false;

while(1)
{
    //-----------클라이언트로부터 수신------------

    int recvsize = recv(sock,buf,sizeof(buf),0);
    printf("recvsize = %d\n",recvsize);

    buf[recvsize] = '\0';
    printf("buf_len = %d\n",strlen(buf));
    .
    .
    .
}

以上结果......

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

recvsize的价值是2525 我期望buf的strlen值当然等于recvsize.However,bufsize有时等于2525,但有时它不一样。 我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

您还有潜在的缓冲区溢出。如果recv()恰好接收到sizeof(buf)个字节数,那么您正在编写一个超出数组边界的NULL终止符。您需要请求sizeof(buf)-1个字节。否则,请勿在{{1​​}}中插入NULL终止符。不要将它视为以null结尾的文本,因为它在技术上是任意数据,并且使用buf返回的值来知道recv()实际上有多少字节。