如何用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
相关产品推荐
相关产品推荐

