首页 > 解决方案 > 为什么 sys socket recv 函数不填充数据但返回字节长度?

问题描述

我正在编写一个 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++clinuxsocketsc++11

解决方案


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

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

相反,使用其他版本的std::string构造函数,它采用字节长度:

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

推荐阅读