使用libzmq实现的订阅发布

本文介绍了Zeromq库中libzmq版本的发布和订阅机制,提供了一个简单的C++代码示例,包括安装步骤和编译指令,以及如何在发布端发送消息和订阅端接收消息的过程。
摘要由CSDN通过智能技术生成

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

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值