使用CZMQ实现的订阅发布

zeromq的官网为:ZeroMQ。使用zmq可以方便的实现进程间通信。

zmq提供了多种语言开发包,如下图:

C语言的开发包又有两种方式,如下图:

本文主要示范czmq的基于订阅和发布的模式,实现数据的传输。实现方式仅供参考

  • 一、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

4.编译安装

make && make check && make install && sudo ldconfig

5./usr/local/lib目录下安装zmq相关库

  • 二、czmq的安装
  1. 将czmq的安装包上传到指定目录,并执行解压操作,本文以4.2.1为例。

tar -zxvf czmq-4.2.1.tar.gz

2.配置并生成makefile

cd czmq-4.2.1

./configure

3.编译安装

make && make check && make install && sudo ldconfig

4.在usr/local/lib下安装czmq相关库

三、使用czmq的方式实现数据传输

代码仅供参考。

消息发布方代码(publisher)

#include "czmq.h"

#include <iostream>

#include <unistd.h>

int main(int argc, char *argv [])

{

       std::string strZmqHost = "tcp://*:5556";

       std::string strTopic = "czmq-topic";

      

    zctx_t *context = zctx_new();

    void *publisher = zsocket_new(context, ZMQ_PUB);

    zsocket_bind(publisher, strZmqHost.c_str());

    sleep(1);

    char szLine[1024];
    while(true)
    {        
        std::cin.getline(szLine, sizeof(szLine));
        fflush(stdin);
        
        std::string str = szLine;
        if(str == "quit") {
            break;
        }
        
        str = strTopic + " " + str;
        int ret = zstr_send(publisher, str.c_str());
        if(ret == -1) {
            std::cout << "send error: " << str << ", ret=" << ret << std::endl;
            break;
        }
        std::cout << "send succ: " << str << std::endl;
    }
    
    std::string str = strTopic + " quit";
    zstr_send(publisher, str.c_str());     

    zsocket_destroy(context, publisher);

    zctx_destroy(&context);

      

    return 0;

}

消息接收方代码(subscriber)

#include <unistd.h>

#include <string>

#include <cstring>

#include <iostream>

#include "czmq.h"

int main()

{

       std::string strZmqHost = "tcp://localhost:5556";

       std::string strSubTopic = "czmq-topic";

       std::string strQuitMsg = strSubTopic + " quit";

      

       zctx_t* lpContext = zctx_new();

       if(lpContext == nullptr)

       {

              std::cout << "zctx_new() error!" << std::endl;

              return -1;

       }

      

    void* lpSubscriber = zsocket_new(lpContext, ZMQ_SUB);

       if(lpSubscriber == nullptr)

       {

              std::cout << "zsocket_new() error!" << std::endl;

              return -2;

       }

      

       int32_t iRet = zsocket_connect(lpSubscriber, strZmqHost.c_str());

       if(iRet != 0) {

              std::cout << "zsocket_connect() error, zmq_host=" << strZmqHost << std::endl;

              return -3;

       }

      

       zsocket_set_subscribe(lpSubscriber, strSubTopic.c_str());

      

       while(true)

       {

              char *lpData = zstr_recv(lpSubscriber);

              if(lpData) {

                     if(strcmp(lpData, strQuitMsg.c_str()) == 0) {

                            free(lpData);

                            break;

                     }

                    

                     puts(lpData);

                     free(lpData);

              }

       }

      

      

       if(lpContext)

       {

              if(lpSubscriber){

                     zsocket_destroy(lpContext, lpSubscriber);

                     lpSubscriber = nullptr;

              }

             

              zctx_destroy(&lpContext);

              lpContext = nullptr;

       }  

      

       return 0;

}

编译并执行:

g++ -o test_sub test_sub.cpp -std=c++11 -lczmq

g++ -o test_pub test_pub.cpp -std=c++11 -lczmq

./test_pub

./test_sub

运行结果:

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值