这是我的代码。
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的值是alaways 2525
而且我希望buf的strlen值当然等于recvsize。但是,bufsize有时等于2525,但是有时不一样。
我想念什么?
最佳答案
这意味着接收到的数据中有一个空字节(这意味着您可能不应该将其视为文本数据开始,而显然是二进制数据)。 recv()
接收到2525个字节,但位于索引126的字节为0x00
。 strlen()
停止从遇到的第一个'\0'
字符开始计数。
您还可能存在缓冲区溢出。如果recv()
恰好接收到准确的sizeof(buf)
个字节,则您正在写NULL终止符,超出了数组的范围。您将需要请求sizeof(buf)-1
个字节。否则,根本不要在buf
中插入NULL终止符。由于它在技术上是任意数据,因此请勿将其视为以空字符结尾的文本,并且请使用recv()
返回的值来了解buf
实际保留了多少字节。
关于c++ - 结果不同;在C++中recv(sock,buf,sizeof(buf),0)和strlen(buf),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43160847/