这是我的代码。

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的字节为0x00strlen()停止从遇到的第一个'\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/

10-13 07:32