ZeroMQ消息损坏数据
ZeroMQ Message Corrupts Data
我正在通过ZeroMQ连接发送一个结构。两个字段是正确的,但其中一个已损坏。为了说明这个问题,我的代码尝试读取zmq消息的内容并创建一个新的结构。
输出:
$ ./client
id = 100
successful = 1
data_size = 356515840
Segmentation fault
客户端.cc
#include <string>
#include <iostream>
#include "zmq.hpp"
#include "struct.h"
int main () {
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REQ);
socket.connect ("tcp://localhost:5555");
query q(100);
q.data_size = 3;
q.data = "abc";
q.successful = true;
zmq::message_t request = q.generate_message();
query test_query((char *) request.data());
return 0;
}
struct.h
#include <arpa/inet.h>
#include "zmq.hpp"
struct query {
long id;
bool successful;
long data_size;
std::string data;
query (long id) {
this->id = id;
this->successful = false;
this->data_size = 0;
this->data = "";
}
query (char *start) {
id = *((long*) start);
start += sizeof(long);
std::cout << "id = " << id << std::endl;
successful = *((bool*) start);
start += sizeof(bool);
std::cout << "successful = " << successful << std::endl;
data_size = *((long *) start);
data_size = ntohl(data_size);
start += sizeof(long);
std::cout << "data_size = " << data_size << std::endl;
data = std::string(start, data_size);
}
long get_total_size() {
return 2 * sizeof(long) + sizeof(bool) + data_size;
}
// The string is encoded by calling data.c_str()
zmq::message_t generate_message() {
long size = get_total_size();
zmq::message_t msg(size);
memcpy((void *) msg.data(), this, size);
char *loc_of_data = (char *) msg.data() + 2 * sizeof(long) + sizeof(bool);
memcpy((void *) loc_of_data, data.c_str(), data_size);
return msg;
}
};
您忽略了填充。
因为您使用的是memcpy
,所以您在消息中的布局与内存结构中的布局相同。并且结构中的long
、bool
、long
具有用于对准目的的填充。
我建议为您的"普通旧数据"创建一个子结构,并停止考虑2 * sizeof(long) + sizeof (bool)
。
相关文章:
- 为什么C中的通用链表中存储的数据已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 类数组正在损坏数据
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 发送特定字节模式时串行端口数据损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- Winapi ReadFile返回损坏的数据
- 向量元素数据损坏了Find()操作
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 写入文本文件的数据部分损坏且无法恢复
- C++和Python之间的数据损坏管道
- 内存中的数据损坏
- 如何在不存在任何数据损坏风险的情况下序列化对象
- 使用 IOCP 的 TCP/IP 服务器.接收缓冲区中偶尔的数据损坏
- 尝试读入内存时检查磁盘上文件的二进制数据损坏情况
- 文件结构,以避免数据损坏
- boost::async_write导致数据损坏
- 链接方法会导致数据损坏
- 通过复制捕获Lambda函数会导致数据损坏