C++接入ZeroMQ核心是建上下文、选套接字类型、按模式收发数据;需创建zmq::context_t并复用,依场景选ZMQ_REQ/REP或ZMQ_PUB/SUB,注意收发顺序与资源释放。

用C++接入ZeroMQ做消息通信,核心就三件事:建上下文、选套接字类型、按模式收发数据。它不依赖中间服务,也不需要手动管理TCP连接,写起来比原生Socket轻量得多。
初始化上下文和套接字
每个程序先创建一个zmq::context_t对象,通常传1表示启用1个I/O线程:
- 上下文是线程安全的,整个进程一般只建一次,后续所有套接字都从它派生
- 客户端常用
ZMQ_REQ,服务端对应ZMQ_REP;广播场景用ZMQ_PUB和ZMQ_SUB - 服务端调
bind("tcp://*:5555")监听;客户端调connect("tcp://localhost:5555")连接
REQ/REP同步请求-响应
这是最直观的“发请求→等回复”模式,适合API调用、远程命令执行等场景:
- 客户端必须先
send()再recv(),顺序不能颠倒;服务端则必须先recv()再send() - 如果服务端没及时回,客户端会一直阻塞(可加
ZMQ_DONTWAIT改为非阻塞) - 消息体用
zmq::message_t封装,支持二进制数据,比如memcpy(msg.data(), &my_struct, sizeof(my_struct))
PUB/SUB一对多广播
适合行情推送、事件通知、日志分发等不需要应答的场景:
立即学习“C++免费学习笔记(深入)”;
- 发布者用
ZMQ_PUB绑定地址,调send()发消息;订阅者用ZMQ_SUB连接后,先调setsockopt(ZMQ_SUBSCRIBE, ...)设置主题(空字符串表示接收所有) - 注意:订阅者只能收到连接之后发布的消息,之前发的不会缓存
- 支持多级主题过滤,比如发
"stock.AAPL",订"stock."就能匹配
收发完成后别忘清理资源
ZeroMQ不自动释放底层句柄,容易内存泄漏:
- 每用完一个socket,显式调
socket.close() - 程序退出前,调
context.close()或context.destroy() - C++ RAII风格下,推荐用智能指针或作用域自动管理,避免裸指针忘记关
基本上就这些。模式选对、上下文建稳、收发顺序守牢,ZMQ在C++里跑得又快又稳。











