c++如何使用ZeroMQ进行消息通信_c++ ZMQ模式与实践【网络】

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_PUBZMQ_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一对多广播

适合行情推送、事件通知、日志分发等不需要应答的场景:

  • 发布者用ZMQ_PUB绑定地址,调send()发消息;订阅者用ZMQ_SUB连接后,先调setsockopt(ZMQ_SUBSCRIBE, ...)设置主题(空字符串表示接收所有)
  • 注意:订阅者只能收到连接之后发布的消息,之前发的不会缓存
  • 支持多级主题过滤,比如发"stock.AAPL",订"stock."就能匹配

收发完成后别忘清理资源

ZeroMQ不自动释放底层句柄,容易内存泄漏:

  • 每用完一个socket,显式调socket.close()
  • 程序退出前,调context.close()context.destroy()
  • C++ RAII风格下,推荐用智能指针或作用域自动管理,避免裸指针忘记关

基本上就这些。模式选对、上下文建稳、收发顺序守牢,ZMQ在C++里跑得又快又稳。