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