有关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
可惜不是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 }
然后在过程中出现了问题 s_sendmore,s_send这个2个函数在瞎子啊过来的zmq.hpp种并没有。vcpkg下载的库里也找不到,又是一顿找博客看,
zmq源码阅读 --- 几个关键的类 -- s_send + s_recv_alpha_2017的博客-CSDN博客
感谢这些前辈,做项目的根本没时间这么细致的看源码。也可能是我漏掉了。
懒人当然想要直接拿来用谁还想重新封装头文件,又找了一下说是需要zhelpers.hpp包含这个文件,可以去官网找,兜兜转转到处是坑啊 这么就不能一次都搞好。
然后上面的代码就跑起来了。然后当然是ctrl+c ctrl+v撸到自己的代码里,看看效果了。确实可以工作了非常的不错。大约花了6多个小时把zmq搞进去。本着拿来主义就先不去细究源码了,毕竟能用就行,真遇到问题再看。只能说东西太多了,根本看不过来,只能靠前辈们洒热血总结归纳了。