zmq 踩坑

zmq 作为一个基础的消息组件, 基本上是我们做通信的唯一选择, 事实上也是如此. 这里略记一下刚踩到的一个坑.

pub sub 消息订阅

订阅一个主题的时候我们可能会有如此写法

const char* const subject = "subject";
zmq_setsockopt (socket, ZMQ_SUBSCRIBE, subject, strlen(subject) + 1);

上面代码是错误的, 正确应该这样写

const char* const subject = "subject";
zmq_setsockopt (socket, ZMQ_SUBSCRIBE, subject, strlen(subject));

差别只有一个+1

一个正常的send写法

rc = zmq_send (socket, &part1, ZMQ_SNDMORE);
rc = zmq_send (socket, &part2, ZMQ_SNDMORE);
....
rc = zmq_send (socket, &partn, 0);

python的写法

socket.send("subject message");

我们会发现subject主题与message只用了一个空格表示, 这样就能正确的找到路由, 经验发现通过第一种方法, 我们是无法接受到python发送的数据的, 我们猜测主题订阅的时候, 是通过二进制匹配的, 实际上我们订阅的主题应该是subject\0. 所以第一种写法是错误的.

有趣的事情

如果订阅和发布两边都是用C++写的, 我们采用第一种方法却不会出问题.

欢迎大家订阅雀观代码, 我将给你讲述, 中小企业程序员, 淘金路上的故事.



发表评论

电子邮件地址不会被公开。 必填项已用*标注