计划赶不上变化

导航

有关zmq和vcpkg的使用

在项目中需要用到zmq来进行通信。

所以就大致查了一下,也来大致总结下

项目前提:客户有一个已经写好的zmq的模块,需要我在自己的模块里添加zmq去通信。

客户告诉我说zmq的版本是3.5.2版本。

于是我就去https://github.com/zeromq/cppzmq/ 找,根本也没有对应的版本,一头雾水的去网上找了很多的帖子看,大致也了解了一些皮毛。

1.这个zmq有很多的语言版本,支持很广。我这里需要用到c++的。

2.zmq有3种通讯模式  1)请求回应类型类似tcp  2)发布订阅模式和mqtt很像 3)管道模型    我这里需要用到的是发布订阅模型

 

 

     1                    2                      3

 3.关于下载编译。我也在到处寻找和客户对应的版本,如下的这个博客里有对应的下载版本。

https://blog.csdn.net/changqing5818/article/details/46916293

 http://download.zeromq.org/

可惜不是c++的版本,我找遍了都找不到一个c++的3.2.5的版本,连github上都只有4.系列。因为项目上用的一个vcpkg的三方库管理我就打算去那里找找。

那么又要去看对应的vcpkg的内容了。

vcpkg

这个管理包具体的介绍我就说了,工程师要的就是怎么用。

参考博客VCPKG在Linux,windows,macos下的安装教程。_早睡的叶子的博客-CSDN博客_linux vcpkg

 git clone https://github.com/microsoft/vcpkg

 ./vcpkg/bootstrap-vcpkg.sh

安装完毕后就是使用 ,在安装好的目录下有一个vcpkg文件 直接去执行它

./vcpkg install [packages ]    安装包的指令

./vcpkg search [packages ]   寻找包的指令

./vcpkg remove [packages ]   移除包的指令

如果找不到那就没办法了。如果找不到对应的版本,可以尝试在当前的目录下去git log查

这里贴上一个指令方便查找git log --color=always --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad)' --date=short | grep --color=never [你要查的]

然后就可以找有没有对应的版本,如果无 那就放弃,如果有那就git checkout 到对应的提交,然后再./vcpkg install [packages ]   就可以下到对应版本的包了

非常的不幸这里没有我要对应版本cppzmq的包。没得办法只能硬着头皮,先下过来调调看。

 

开始盲调。

先参考网上的帖子搞了一个代码看看效果,明白原理。

消息队列之ZeroMQ(C++) - 深空灰 - 博客园 (cnblogs.com) 这个博客园写的很好,搞了几个线程然后把这个订阅的搞得挺好,唯一可惜的是windows平台的,需要做小小的修改。

  1 #include <zmq.hpp>
  2 #include <string>
  3 #include <iostream>
  4 //#include <windows.h>
  5 #include<zhelpers.hpp>
  6 #include <thread>
  7 #include <unistd.h>
  8 using namespace std;
  9 
 10 
 11 //订阅1
 12 void MyThread_sub1()
 13 {
 14     zmq::context_t context(1);
 15     zmq::socket_t subscriber (context, ZMQ_SUB);
 16     //连接
 17     subscriber.connect("tcp://localhost:5563");
 18     //设置频道B
 19     subscriber.setsockopt( ZMQ_SUBSCRIBE, "A", 1);
 20     while (1) {
 21  
 22         //  Read envelope with address
 23         std::string address = s_recv (subscriber);
 24         //  Read message contents
 25         std::string contents = s_recv (subscriber);
 26         
 27         std::cout << "订阅1:[" << address << "] " << contents << std::endl;
 28     }
 29     return ;
 30 
 31 }
 32 //订阅2
 33 void MyThread_sub2()
 34 {
 35     zmq::context_t context(1);
 36     zmq::socket_t subscriber (context, ZMQ_SUB);
 37     //连接
 38     subscriber.connect("tcp://localhost:5563");
 39     //设置频道B
 40     subscriber.setsockopt( ZMQ_SUBSCRIBE, "B", 1);
 41     while (1) {
 42  
 43         //  Read envelope with address
 44         std::string address = s_recv (subscriber);
 45         //  Read message contents
 46         std::string contents = s_recv (subscriber);
 47         
 48         std::cout << "订阅2:[" << address << "] " << contents << std::endl;
 49     }
 50     return ;
 51 
 52 }
 53 //订阅3
 54 void MyThread_sub3()
 55 {
 56     zmq::context_t context(1);
 57     zmq::socket_t subscriber (context, ZMQ_SUB);
 58     //连接
 59     subscriber.connect("tcp://localhost:5563");
 60     //设置频道B
 61    // subscriber.setsockopt( ZMQ_SUBSCRIBE, "B", 1);
 62     while (1) {
 63  
 64         //  Read envelope with address
 65         std::string address = s_recv (subscriber);
 66         //  Read message contents
 67         std::string contents = s_recv (subscriber);
 68         
 69         std::cout << "订阅3:[" << address << "] " << contents << std::endl;
 70     }
 71     return ;
 72 
 73 }
 74 //发布线程
 75 void MyThread_pub()
 76 {
 77     //  Prepare our context and publisher
 78     zmq::context_t context(1);
 79     zmq::socket_t publisher(context, ZMQ_PUB);
 80     publisher.bind("tcp://*:5563");
 81 
 82     while (1) {
 83         //  Write two messages, each with an envelope and content
 84         s_sendmore (publisher, "A");
 85         s_send (publisher, "We don't want to see this");
 86 
 87         sleep (4);
 88         s_sendmore (publisher, "B");
 89         s_send (publisher, "We would like to see this");
 90         sleep (4);
 91 
 92     }
 93 }
 94 
 95 int main () 
 96 {
 97     //std::thread t1(MyThread_pub);
 98      sleep (5);
 99     std::thread t2(MyThread_sub1);
100     std::thread t3(MyThread_sub2);
101     std::thread t4(MyThread_sub3);
102    // t1.join();
103 t2.join();
104 t3.join();
105 t4.join();
106     while(1);
107     return 0;
108 }
View Code

然后在过程中出现了问题   s_sendmore,s_send这个2个函数在瞎子啊过来的zmq.hpp种并没有。vcpkg下载的库里也找不到,又是一顿找博客看,

 zmq源码阅读 --- 几个关键的类 -- s_send + s_recv_alpha_2017的博客-CSDN博客

感谢这些前辈,做项目的根本没时间这么细致的看源码。也可能是我漏掉了。

 

 

 

 懒人当然想要直接拿来用谁还想重新封装头文件,又找了一下说是需要zhelpers.hpp包含这个文件,可以去官网找,兜兜转转到处是坑啊 这么就不能一次都搞好。

然后上面的代码就跑起来了。然后当然是ctrl+c ctrl+v撸到自己的代码里,看看效果了。确实可以工作了非常的不错。大约花了6多个小时把zmq搞进去。本着拿来主义就先不去细究源码了,毕竟能用就行,真遇到问题再看。只能说东西太多了,根本看不过来,只能靠前辈们洒热血总结归纳了。

 

posted on 2022-04-26 21:08  张培粉  阅读(525)  评论(0编辑  收藏  举报