为了弄明白ZMQ中的PGM协议,博主焦虑了不少。总结原因:1、ZMQ的中文文献太少;2、ZMQ在windows下的文献太少;3、国内不翻墙能访问的网站太少。
- 遇到一个看起来不那么棘手的问题
好了,言归正传,本文仅记录博主的艰辛历程。
在官网下载好ZeroMQ源码后,编译好,然后按照文档写出Pub-Sub模式的测试代码。竟然在bind的时候就报错
void *publisher = zmq_socket (context, ZMQ_PUB);
int rc =
zmq_bind(publisher, "pgm://192.168.31.100;239.192.1.1:5555");
查看错误码129 使用zmq_strerror 得到字符串竟然是“”Not supported“,有些心塞,跟踪源码发现是有一个宏的定义ZMQ_HAVE_OPENPGM。原来:ZeroMQ在使用pgm/epgm协议时,如果此宏没有定义,则返回上述代码。于是我在vs中定义好该宏,然后重新编译libzmq项目,又是一堆错,OpenPgm原来是另一个库。在源码目录foreign有它的源码。当然如果有源码一切就好说(以后博主再也不会这么天真了)。
- 开始寻找解决问题方案
大致看了libPGM 的目录,发现没有MSVC的项目文件,于是我新建VS项目,将Libpgm的文件一个一个加入,编译后还是报了一堆错。 博主此时深吸一口气,以为凭着自己的小聪明就能化解眼前的难题。归纳报错的原因。主要有:A.头文件打不开,如glib.h、stdbool.h、net-snmp目录下的一堆H文件。这么多依赖的库都没有,博主开始还很有耐心的一个一个解决,但是到后来发现这是一个无底洞。整理了下思路,我目前的重点是要找到在windows下使用ZMQ的PGM协议,并不是要源码呀! 想明白了这个,博主先找到libpgm官网上编译好的版本,安装完成发现也不支持pgm。于是博主开始在网上找OpenPGM 编译好的库。而使用baidu基本收不到相关的中文结果,搜出来的英文网站基本打不开。无奈之下,只能想尽办法去翻墙找答案。皇天不负有心人。终于在某网站上找到了。能直接翻墙的请进入该链接下载。。
https://miru.hk/openpgm/
当然,如果你不能翻墙也没有关系,请在CSDN上直接下载(此处有5.1.118与5.2.122版本,下载这两个版本是因为博主编译的zeromq-3.2.5与zeromq-4.1.5分别使用的这两个版本的openpgm )
http://download.csdn.net/detail/pc0de/9627713
http://download.csdn.net/detail/pc0de/9627713
- 重新编译ZeroMQ,问题解决
- 遗留问题
问题解决了,那该结束了吗?其实并没有,因为博主又遇到了新的问题。使用PGM在局域网内成功跑起来没错,但是为何在一台机器上同时开启订阅分发,订阅端收不到数据呢?