我正在编写一个 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
构造函数将在第一个空字节处停止,无论 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::string
处理 nul 字节 (0x00
) 的方式有些不一致。当您需要处理这些问题时,更喜欢 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'; // always 9