为什么sys socket receive函数不填充数据而是返回字节长度?

问题描述 投票:0回答:3

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

c++ c linux sockets c++11
3个回答
8
投票

如果

recv
返回一个值,则该值就是接收到的字节数。

问题在于您使用了错误的函数来确定您收到的数据。您使用的

std::string
构造函数将在第一个空字节处停止,无论
recv
返回的实际字节数是多少。

相反,请使用采用字节长度的

std::string
构造函数的其他版本:

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

5
投票

您期望收到的数据以零结尾。这是一个错误的期望,因为它可能会收到不完整的数据。正确的方法是使用

received_size
(错误检查完成后):

std::string str(data, received_size);

这在实际应用中仍然不够。您需要以某种方式分隔消息


-2
投票
由于遗留原因,

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
© www.soinside.com 2019 - 2024. All rights reserved.