c++ - ZeroMQ 消息破坏数据

标签 c++ sockets zeromq

我正在通过 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;
}

结构.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,所以您在消息中放置的布局与内存中结构中存在的布局相同。并且结构中的 longboollong 具有用于对齐目的的填充。

我建议为您的“普通旧数据”提供子结构,并停止考虑 2 * sizeof(long) + sizeof (bool)

关于c++ - ZeroMQ 消息破坏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057640/

相关文章:

c++ - 编写递归 C++ 函数,计算并返回数组中整数的乘积

sockets - 关于 UDP 服务器如何将响应发送回 UDP 客户端的困惑

sockets - 如何修复 mediawiki 中的 'Redis server error: socket error on read socket' 错误

c++ - Qt 表单中是否有 onChange 事件?

c++ - QScintilla,示例项目不起作用

javascript - 如何通过代理或作为中间件来操作 socket.io 数据?

linux - IPC ://and concurrency 上的 ZeroMQ REQ/REP

java - ZMQ Pub Sub - 它应该丢弃消息吗?

c# - NetMQ 未处理异常最佳实践

c++ - 为什么二维整数数组适用于字符?