文章目录核心方案使用 zmq_poller1. 创建 poller2. 添加 socket 到 poller3. 等待事件4. 处理事件完整示例监听多个 SUB socket高级用法1. 动态管理 socket2. 非阻塞模式3. 超时设置最佳实践适用场景总结当需要连接多个 socket 并同时监听消息时使用 ZeroMQ 的zmq_poller是最佳选择。核心方案使用 zmq_poller1. 创建 pollervoid*pollerzmq_poller_new();2. 添加 socket 到 poller// 添加多个 socketzmq_poller_add(poller,socket1,NULL);zmq_poller_add(poller,socket2,NULL);// 可以添加更多 socket...3. 等待事件zmq_pollitem_t items[2];// 也可以动态分配items[0].socketsocket1;items[0].fd0;items[0].eventsZMQ_POLLIN;items[1].socketsocket2;items[1].fd0;items[1].eventsZMQ_POLLIN;// 等待事件timeout 为 -1 表示无限等待intrczmq_poll(items,2,-1);if(rc-1){// 处理错误}4. 处理事件// 检查哪个 socket 有事件if(items[0].reventsZMQ_POLLIN){// socket1 有消息charbuffer[1024];zmq_recv(socket1,buffer,sizeof(buffer),0);printf(Received from socket1: %s\n,buffer);}if(items[1].reventsZMQ_POLLIN){// socket2 有消息charbuffer[1024];zmq_recv(socket2,buffer,sizeof(buffer),0);printf(Received from socket2: %s\n,buffer);}完整示例监听多个 SUB socket#includezmq.h#includestdio.hintmain(){void*ctxzmq_ctx_new();// 创建多个 SUB socketvoid*sub1zmq_socket(ctx,ZMQ_SUB);zmq_connect(sub1,tcp://localhost:5555);zmq_setsockopt(sub1,ZMQ_SUBSCRIBE,,0);// 订阅所有消息void*sub2zmq_socket(ctx,ZMQ_SUB);zmq_connect(sub2,tcp://localhost:5556);zmq_setsockopt(sub2,ZMQ_SUBSCRIBE,,0);// 准备 poll itemszmq_pollitem_t items[]{{sub1,0,ZMQ_POLLIN,0},{sub2,0,ZMQ_POLLIN,0}};while(1){intrczmq_poll(items,2,-1);if(rc-1)break;// 中断if(items[0].reventsZMQ_POLLIN){charbuffer[1024];zmq_recv(sub1,buffer,sizeof(buffer),0);printf(From publisher 1: %s\n,buffer);}if(items[1].reventsZMQ_POLLIN){charbuffer[1024];zmq_recv(sub2,buffer,sizeof(buffer),0);printf(From publisher 2: %s\n,buffer);}}zmq_close(sub1);zmq_close(sub2);zmq_ctx_term(ctx);return0;}高级用法1. 动态管理 socket// 动态添加 socketvoidadd_socket_to_poller(void*poller,void*socket){zmq_poller_add(poller,socket,NULL);}// 移除 socketvoidremove_socket_from_poller(void*poller,void*socket){zmq_poller_remove(poller,socket);}2. 非阻塞模式// 非阻塞立即返回intrczmq_poll(items,2,0);if(rc0){// 无事件继续其他工作}3. 超时设置// 1000ms 超时intrczmq_poll(items,2,1000);if(rc0){// 超时做其他事情}最佳实践使用 zmq_poller单线程处理多 socket避免线程开销合理设置超时根据应用需求调整错误处理检查所有 ZeroMQ 函数的返回值资源管理正确关闭所有 socket 和 poller事件驱动基于事件处理提高响应速度适用场景多订阅同时订阅多个 publisher多客户端服务器同时处理多个客户端连接混合模式同时处理不同类型的 socket如 SUB REP资源监控同时监听多个数据源总结连接多个 socket 并监听消息的最佳方案使用zmq_poller管理多个 socket一次等待多个 socket 的事件根据事件来源处理不同 socket 的消息单线程处理避免线程复杂性这种方式比多线程更高效代码更简洁是 ZeroMQ 推荐的多 socket 管理方式