【问题标题】:zmq::message_t assign a stringzmq::message_t 分配一个字符串
【发布时间】:2022-09-22 03:02:19
【问题描述】:

我试图通过在发布者和订阅者之间创建一个简单的套接字通信来发送测试消息来熟悉 ZeroMQ。但是,我找不到有关如何将字符串放入 zmq::message_t 类型消息的信息。迹象表明我尝试过使用 \"std::memcpy(message.data(), ms.data(), ms.size())\"。但是,通过使用 Watchs 调试编码,我看到执行后消息仍然为空: WATCH IMAGE 当我使用 cout 打印出来时它也是空的:Cmd 是否有另一种方法可以将字符串分配给 zmq::message_t 消息,或者这里还有其他问题吗?

我的整个代码是:

int main()
{
    zmq::context_t context(1);

    zmq::socket_t pub(context, ZMQ_PUB);
    pub.bind(\"tcp://*:5555\");
    std::cout << \"Pub Connected\" << std::endl;

    zmq::socket_t sub(context, ZMQ_SUB);    
    sub.connect(\"tcp://localhost:5555\");
    std::cout << \"Sub Connected\" << std::endl;

    std::stringstream s;
    s << \"Hello World\";
    auto ms = s.str();

    zmq::message_t message(ms.size());
    memcpy(message.data(), ms.c_str(), ms.length());
    pub.send(message, zmq::send_flags::none);
    std::cout << \"message: \" << message << std::endl;

    zmq_sleep(1);

    sub.set(zmq::sockopt::subscribe, \"Hello World\");

    zmq::message_t rx_msg;

    sub.recv(rx_msg,zmq::recv_flags::none);

    std::string rx_str;
    
    rx_str.assign(static_cast<char*>(rx_msg.data()), rx_msg.size());

    std::cout << \"Message: \" << rx_str << \"received!\" << std::endl;
}

    标签: c++ zeromq


    【解决方案1】:

    zmq::message_t 的构造函数具有签名 (docs)

    message_t(const void *data_, size_t size)
    

    所以你可以像这样使用它

    zmq::message_t message(static_cast<void*>(ms.data()), ms.size());
    

    【讨论】:

    • 感谢您的帮助,它在使用 cout 时效果很好,但似乎没有出现在手表上。我还删除了“static_cast<void*>”,因为它会导致无效转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多