为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
why sys socket recv function don't fill data but return bytes length?
我正在编写一个 c++ 客户端。客户端使用 TCP 协议成功连接到服务器并发送数据。我写了下面的代码来接收数据:
char data[9];
int received_size = recv(fd, data, 9, flags);
std::string str{ data };
// str.empty() is true
哪些标志是MSG_NOSIGNAL的。
问题是在执行此行后,received_size为 9,但数据长度为零。
如果recv
返回一个值,那么这就是接收的字节数。
问题是您使用了错误的函数来确定要接收的数据。 你正在使用的构造函数std::string
将在第一个 null 字节处停止,而不recv
返回的实际字节数。
相反,请使用采用字节长度的std::string
构造函数的其他版本:
char data[9];
int received_size = recv(fd, data, 9, flags);
std::string str(data, received_size);
您期望接收的数据以零终止。这是一个错误的期望,因为它可以接收不完整的数据。正确的方法是使用received_size
(在完成错误检查后(:
std::string str(data, received_size);
这在实际应用中仍然不够。您需要以某种方式分隔消息。
如果需要处理零字节,请使用std::vector<unsigned char>
而不是std::string
:
char data[9];
int received_size = recv(fd, data, 9, flags);
std::vector<unsigned char> str( std::begin(data), std::begin(data)+received_size );
std::cout << str.size() << 'n';
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- C++/CX 如何从 IRandomAccessStream^ 转换为字节并返回.(UWP)
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- C++ 从函数返回无符号字节
- 裸__declspec上的 memcpy 返回意外的字节
- InternetReadFile 填充缓冲区,但返回零字节读取
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- ::运算符 delete(指针) 返回释放的字节大小
- 函数返回的 gsl::span 具有错误的字节
- 如何迫使新操作员返回的指针将是32字节对齐
- 返回字节数组或将数组传递到函数中
- crypto++将密钥保存到字节队列并返回到密钥
- mbtowc在osx上总是返回一个字节
- C 我应该如何返回字节数组
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 如果在 main 中使用字符串,为什么 CRT 会返回 8 字节泄漏
- TCP Recv使用select()返回1字节读取
- 如何在Crypto++中返回字节值
- Microsoft psapi方法是否使用十进制或二进制表示法返回字节?
- 函数接受两个参数,一个字节和一个位字段,并返回字节中字段的值