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

时间:2018-06-14 09:16:11

标签: c++ c linux sockets c++11

我正在编写一个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,但数据长度为零。

3 个答案:

答案 0 :(得分:6)

如果recv返回一个值,那么这就是接收的字节数。

问题是您使用了错误的函数来确定您收到的数据。您正在使用的std::string构造函数将在第一个空字节处停止,而不管返回的实际字节数recv

相反,请使用占用字节长度的std::string构造函数的另一个版本:

char data[9];
int received_size = recv(fd, data, 9, flags);
std::string str(data, received_size);

答案 1 :(得分:4)

您希望接收的数据为零终止。这是一个错误的期望,因为它可以收到不完整的数据。正确的方法是使用received_size(在完成错误检查后):

std::string str(data, received_size);

在现实世界的应用程序中,这还不够。您需要delimit messages somehow

答案 2 :(得分:-3)

如果您需要处理零字节,请使用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';