You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ZeroMQ在C++服务端与客户端之间发送整数?

嘿,我来帮你搞定ZeroMQ发送整数的问题!其实ZeroMQ底层传输的是字节序列,所以非字符类型的数据都得先转成连续字节再发送,接收时再还原回来就行。下面给你两种常用的实现方案,基于REQ-REP模式(你可以根据自己实际用的通信模式调整,比如PUB-SUB也适用):

ZeroMQ C++ 发送整数类型数据的解决方案

方式一:直接内存拷贝(简单高效)

这种方式直接把整数的内存数据作为消息内容发送,轻量又快捷,适合简单类型的传输。

服务端代码

#include <zmq.hpp>
#include <iostream>

int main() {
    // 创建ZeroMQ上下文
    zmq::context_t context(1);
    // 创建REP类型socket并绑定地址
    zmq::socket_t socket(context, zmq::socket_type::rep);
    socket.bind("tcp://*:5555");

    int send_num = 12345; // 要发送的目标整数
    std::cout << "准备发送整数: " << send_num << std::endl;

    // 直接把整数的内存地址和大小传入zmq消息对象
    zmq::message_t msg(&send_num, sizeof(send_num));
    socket.send(msg, zmq::send_flags::none);

    // REQ-REP模式需要响应客户端请求,这里加个简单的接收响应逻辑
    zmq::message_t reply;
    socket.recv(reply, zmq::recv_flags::none);
    std::cout << "收到客户端响应: " << std::string(static_cast<char*>(reply.data()), reply.size()) << std::endl;

    return 0;
}

客户端代码

#include <zmq.hpp>
#include <iostream>

int main() {
    zmq::context_t context(1);
    zmq::socket_t socket(context, zmq::socket_type::req);
    socket.connect("tcp://localhost:5555");

    // REQ-REP模式要求先发送请求,再接收响应
    zmq::message_t request(5);
    memcpy(request.data(), "Hello", 5);
    socket.send(request, zmq::send_flags::none);

    // 接收服务端发来的整数消息
    zmq::message_t msg;
    socket.recv(msg, zmq::recv_flags::none);

    // 将字节流还原为整数
    int received_num = *static_cast<int*>(msg.data());
    std::cout << "收到服务端的整数: " << received_num << std::endl;

    // 给服务端返回响应
    zmq::message_t reply(7);
    memcpy(reply.data(), "Thanks!", 7);
    socket.send(reply, zmq::send_flags::none);

    return 0;
}

方式二:使用序列化库(适合扩展复杂数据)

如果之后你需要发送结构体、自定义类这类复杂数据,用序列化库会更规范。这里举个nlohmann/json的例子(轻量易用的JSON序列化库):

服务端代码

#include <zmq.hpp>
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    zmq::context_t context(1);
    zmq::socket_t socket(context, zmq::socket_type::rep);
    socket.bind("tcp://*:5555");

    int send_num = 67890;
    // 把整数打包成JSON对象
    json data = {{"number", send_num}};
    std::string json_str = data.dump();

    std::cout << "发送JSON格式的整数: " << json_str << std::endl;
    zmq::message_t msg(json_str.size());
    memcpy(msg.data(), json_str.c_str(), json_str.size());
    socket.send(msg, zmq::send_flags::none);

    // 接收客户端响应
    zmq::message_t reply;
    socket.recv(reply, zmq::recv_flags::none);

    return 0;
}

客户端代码

#include <zmq.hpp>
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    zmq::context_t context(1);
    zmq::socket_t socket(context, zmq::socket_type::req);
    socket.connect("tcp://localhost:5555");

    // 先发送请求
    zmq::message_t request(5);
    memcpy(request.data(), "Hello", 5);
    socket.send(request, zmq::send_flags::none);

    // 接收JSON格式的消息并解析
    zmq::message_t msg;
    socket.recv(msg, zmq::recv_flags::none);
    std::string json_str(static_cast<char*>(msg.data()), msg.size());
    json data = json::parse(json_str);

    int received_num = data["number"];
    std::cout << "解析后得到的整数: " << received_num << std::endl;

    // 返回响应
    zmq::message_t reply(7);
    memcpy(reply.data(), "Thanks!", 7);
    socket.send(reply, zmq::send_flags::none);

    return 0;
}

一些注意点

  • 要是跨不同CPU架构的设备发送数据(比如x86和ARM),得注意字节序问题,用htons/ntohl这类函数转成网络字节序就行,同架构下一般不用操心。
  • 如果发送64位整数(long long),记得把sizeof(int)改成sizeof(long long),接收时也要对应转换类型。
  • 方式一适合简单场景,方式二更适合后续扩展复杂数据结构,根据你的需求选就行~

内容的提问来源于stack exchange,提问作者Rakshith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:56:11