这是我的代码..
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,但有时它不一样。 我错过了什么?
答案 0 :(得分:1)
这意味着接收到的数据中存在空字节(这意味着您可能不应该将其视为文本数据开头,而是显然是二进制数据)。 recv()
收到2525个字节,但位于索引126的字节为0x00
。 strlen()
在遇到的第一个'\0'
字符处停止计数。
您还有潜在的缓冲区溢出。如果recv()
恰好接收到sizeof(buf)
个字节数,那么您正在编写一个超出数组边界的NULL终止符。您需要请求sizeof(buf)-1
个字节。否则,请勿在{{1}}中插入NULL终止符。不要将它视为以null结尾的文本,因为它在技术上是任意数据,并且使用buf
返回的值来知道recv()
实际上有多少字节。