为什么 sys 套接字 recv 函数不填充数据但返回字节长度?

why sys socket recv function don't fill data but return bytes length?

本文关键字:返回 字节 数据 填充 套接字 sys recv 函数 为什么      更新时间:2023-10-16

我正在编写一个 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';