结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
The results are different ; recv(sock,buf,sizeof(buf),0) and strlen(buf) in c++
这是我的代码。
char buf[5000];
bool isHandshaking = false;
bool isSingaling = false;
while(1)
{
//-----------클라이언트로부터 수신------------
int recvsize = recv(sock,buf,sizeof(buf),0);
printf("recvsize = %dn",recvsize);
buf[recvsize] = ' ';
printf("buf_len = %dn",strlen(buf));
.
.
.
}
以上结果...
recvsize = 2525
buf_len = 126 /*(or different value, sometimes 2525)*/
回复值为 2525我预计 buf 的 strlen 值当然会等于 recvsize。但是 bufsize 有时等于 2525,但有时却不一样。我错过了什么?
这意味着接收到的数据中有一个空字节(这意味着您可能不应该一开始就将其视为文本数据,它显然是二进制数据(。 recv()
收到 2525 个字节,但位于索引 126 的字节0x00
。 strlen()
在遇到的第一个' '
字符时停止计数。
您还存在潜在的缓冲区溢出。如果recv()
碰巧接收到sizeof(buf)
字节数,则表示您将 NULL 终止符写入数组的边界之外。 您需要请求sizeof(buf)-1
字节。否则,根本不要在 buf
中插入 NULL 终止符。不要将其视为以 null 结尾的文本,因为它在技术上是任意数据,并且确实使用 recv()
返回的值来了解buf
实际包含多少字节。
相关文章:
- 为什么这个程序的结果是3 "born"?和 4 死
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- C++初始化的结果是什么?
- 我的输出结果是 0 英寸C++.可能是什么问题
- 在C++中使用 fread() 来解释这个结果是什么?
- 为什么双算的结果是错误的?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- 是迭代器增量结果是新的迭代器
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 非常量表达式的左值到右值转换的结果是常数吗?
- 将Execl命令的结果(是目录列表)输送到父进程
- 如果我将未签名的int添加到负int且算术结果是正面的,会发生什么
- decltype( (A{}.int_member) 的正确结果是什么)
- 当我们在int上进行操作时,结果是暂时存储在int中的结果
- 大端序中的以下代码的结果是什么
- 并发::when_all的结果是 FIFO 吗?
- 递归宏点差的结果是什么
- static_casting constexpr void* 的结果是常量表达式吗?
- 将双精度转换为 int 的结果是错误的