2017-04-01 33 views
0

这是我的代码..结果不同;的recv(袜子,BUF,的sizeof(BUF),0)和strlen的(BUF)中的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 is alaways 2525 而且我预计buf的strlen值当然会等于recvsize。但是,bufsize有时候等于2525,但有时它不一样。 我错过了什么?

+3

你知道[std :: strlen](http://en.cppreference.com/w/cpp/string/byte/strlen)是否计数到它找到的第一个''\ 0'? – Galik

+0

@Galik说的是'recvsize'是套接字上接收到的字节数。然而,一个字符串是一个字符数组,而当传递给'strlen()'时,字节数组现在假设字符串语义而不是字节数组语义。因此,'strlen()'返回从起始点到找到字符串结尾或零值时发现的字符数。要确定这是否确实发生了什么,可以检查'strlen()'返回的长度之后的字符是否为零。 –

回答

1

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

您也有潜在的缓冲区溢出。如果recv()恰好收到sizeof(buf)字节数,则表示正在向数组的边界外写入NULL终止符。您需要改为请求sizeof(buf)-1字节。否则,根本不要将NULL终止符插入到buf中。不要将它视为空终止的文本,因为它在技术上是任意数据,并且使用recv()返回的值来知道有多少个字节实际上保留。

相关问题