c++ - 为什么 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,但数据长度为零。
解决方案
如果recv
返回一个值,那么这就是接收到的字节数。
问题是您使用错误的函数来确定您收到的数据。您正在使用的std::string
构造函数将在第一个空字节处停止,而与返回的实际字节数recv
无关。
相反,使用其他版本的std::string
构造函数,它采用字节长度:
char data[9];
int received_size = recv(fd, data, 9, flags);
std::string str(data, received_size);
推荐阅读
- c - 如何使用 uECC 计算签名?
- java - 使用 oracle olapi 未发现数据异常
- html - 在 InteliJ 中将 Javadoc 导出为 html
- android - android gradle 3.2.1 到 3.3.1 使用 CDATA 破坏字符串资源
- java - 在 Java 中按列而不是行对 2D 数组进行平面映射
- python - 如何打印数组元素?
- ansible - 运行一个未包含在剧中但属于角色的 ansible 任务
- r - 如何替换 R 矩阵中匹配行名、列名和值的值
- excel - 如何使用 VBA 插入包含数字变量的公式
- angular - 部署在 Kubernetes 入口路径上时无法获得 Angular 7 路由