zmq python发布c ++订阅

时间:2016-06-17 20:08:19

标签: python c++ python-3.x zeromq publish-subscribe

我在c++中有一个ZeroMQ发布商(使用 zhelpers.hpp )和python3中的ZeroMQ订阅者(使用 pyzmq )。

麻烦的是,订户中没有收到任何消息。我想,ZeroMQ过滤器存在问题。我无法弄清楚,如何在.setsockopt()中正确使用c++来回复来自python发布者的消息。

Python发布者:

    import zmq
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.bind("tcp://*:4004")
    while True:
      command = input("insert command ")
      if (command=='c'):
            topic = "CALL".encode("ascii")
            data = "blabla".encode("ascii")
            socket.send_multipart([topic,data])

C++订阅者:

    #include "zhelpers.hpp"
    zmq::context_t context(1);
    zmq::socket_t subscriber1 (context, ZMQ_SUB);
    subscriber1.connect("tcp://127.0.0.1:4004");
    subscriber1.setsockopt( ZMQ_SUBSCRIBE, "CALL", 4);
    while (1) {
        // read envelope
        std::string address = s_recv (subscriber1);
        // read message
        std::string contents = s_recv (subscriber1);
        std::cout << "[" << address << "] " << contents << std::endl;

Python订阅者工作正常。代码:

    subscriber = context.socket(zmq.SUB)
    subscriber.connect("tcp://127.0.0.1:4004")
    subscriber.setsockopt(zmq.SUBSCRIBE, b"CALL")
    [command, contents] = self.subscriber.recv_multipart()

2 个答案:

答案 0 :(得分:0)

来自docssetsockopt的最后一个参数是选项值的长度。在您的情况下,您传递的字符串的长度作为过滤器值。

当您输入8时,c ++的长度将读取8个字符,但您的过滤字符串只有4个字符长。这导致包含一些随机数据的过滤器。如果你很幸运,过滤器有时会匹配,但它非常不合适。

将方法调用更改为:

subscriber1.setsockopt( ZMQ_SUBSCRIBE, "CALL", 4);

你希望c ++只读取那里的东西,而不是更多。

答案 1 :(得分:0)

我最后使用zhelpers.h切换到C语言。我不得不将libzmq-dev更新为版本&gt; 3.2。我在zguide上使用了示例:zmq subscriber in c