【问题标题】:zmq python publish c++ subscribezmq python 发布 c++ 订阅
【发布时间】:2016-06-17 20:08:19
【问题描述】:

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

问题是,订阅者没有收到任何消息。我想,ZeroMQ 过滤器有问题。我不知道如何在c++ 中正确使用.setsockopt() 来接收来自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()

【问题讨论】:

  • 您能否确认py3c++ 使用相同版本的ZeroMQ API 规范?最近消息头大小/映射的变化可能使旧版本 c++ 绑定的行为无效。
  • 是的,你是对的,版本不匹配。

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


【解决方案1】:

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

正如您在8 中输入的那样,长度 c++ 将读取 8 个字符,但您的过滤器字符串只有 4 个字符长。这会产生一个包含一些随机数据的过滤器。如果幸运的话,过滤器有时会匹配,但不太可能。

将方法调用改成这样:

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

您希望 c++ 仅读取现有内容而不是更多内容。

【讨论】:

  • 这是有道理的。但是订阅者仍然没有得到任何东西。
  • 如果您删除订阅电话,您会得到什么吗? (默认订阅所有消息)
  • 所以我删除了这一行:subscriber1.setsockopt( ZMQ_SUBSCRIBE, "CALL", 4);。还是什么都没有……
  • @DaniloZimsek 如果你也用 python 编写订阅者会发生什么。那你收到消息了吗?
【解决方案2】:

我最终使用 zhelpers.h 切换到 C。我不得不将 libzmq-dev 更新到版本 > 3.2。我在 zguide 上使用了示例:zmq subscriber in c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多