Zeromq提供了多种语言开发包,其中C语言的开发包又有两种方式,即:czmq和libzmq。
官方推荐使用czmq。我之前写过一篇使用czmq的订阅和发布的使用示例。虽然官方并不推荐libzmq,但是用的还挺多,所以本文主要介绍下libzmq的发布和订阅使用方法。仅供参考!
订阅发布的说明:
订阅端通过以下语句进行订阅:
zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, topic.c_str(), topic.length());
发布端发布不同主题的消息,zmq会根据订阅情况,把不同主题的消息推给对应的订阅者。
一、zmq的安装
1.将zeromq的安装包上传到指定目录,并执行解压操作,本文以4.2.1为例。
tar -zxvf zeromq-4.2.1.tar.gz
2. 自动生成配置
cd zeromq-4.2.1
./autogen.sh
3.根据配置生成makefile
./configure
.编译安装
make && make check && make install && sudo ldconfig
5./usr/local/lib目录下安装zmq相关库
二、示例代码
//发布端代码zmq_pub.cpp
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <iostream>
int main (void)
{
std::string topic = "libzmq-topic";
void *context = zmq_ctx_new ();
void *publisher = zmq_socket (context, ZMQ_PUB);
int rc = zmq_bind (publisher, "tcp://*:5555");
assert (rc == 0);
std::cout << "pub side start succ!" << std::endl;
int ret = 0;
std::string msg;
while (1)
{
std::getline(std::cin, msg);
fflush(stdin);
if(msg == "quit")
{
msg = topic + " quit";
zmq_send (publisher, msg.c_str(), msg.length(), 0);
std::cout << "pub side quit." << std::endl;
break;
}
if(!msg.empty())
{
msg = topic + " " + msg;
ret = zmq_send (publisher, msg.c_str(), msg.length(), 0);
if(ret == msg.length())
{
std::cout << "pub msg succ, msg=" << msg << std::endl;
}
else
{
std::cout << "pub fail, ret=" << ret << ", msg=" << msg << std::endl;
}
}
}
zmq_close(publisher);
zmq_ctx_destroy(context);
return 0;
}
//订阅端代码zmq_sub.cpp
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main (void)
{
std::string topic = "libzmq-topic";
std::string quit_msg = topic + " quit";
void *context = zmq_ctx_new ();
void *subscriber = zmq_socket (context, ZMQ_SUB);
int ret = zmq_connect (subscriber, "tcp://localhost:5555");
if(ret != 0)
{
std::cout << "zmq_connect() error, server_ip=tcp://localhost:5555, ret=" << ret << std::endl;
return 0;
}
std::cout << "connect to zmq server succ!" << std::endl;
ret = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, topic.c_str(), topic.length());
if (ret != 0) {
std::cout << "zmq sub faild! "<< topic << std::endl;
return 0;
}
std::cout << "subscribe succ, topic=" << topic << std::endl;
int recv_len = 0;
char buffer[1024] = { 0 };
while (1)
{
memset(buffer, 0, sizeof(buffer));
recv_len = zmq_recv(subscriber, buffer, sizeof(buffer), 0);
if (recv_len != -1)
{
if(strcmp(buffer, quit_msg.c_str()) == 0)
{
std::cout << "sub side quit" << std::endl;
break;
}
std::cout << "sub side recv msg, msg=" << buffer << std::endl;
}
}
zmq_close (subscriber);
zmq_ctx_destroy (context);
return 0;
}
编译:
g++ -o zmq_pub zmq_pub.cpp -std=c++11 -lzmq
g++ -o zmq_sub zmq_sub.cpp -std=c++11 -lzmq
运行结果: