【问题标题】:ZeroMQ - C++ Publisher and Python SubscriberZeroMQ - C++ 发布者和 Python 订阅者
【发布时间】:2021-04-07 08:40:45
【问题描述】:

我无法接收带有 Python 订阅者的 C++ 发布者通过 ZeroMQ 发送的消息。通过 Python 发布者发送的消息可以被 Python 订阅者接收,但通过 C++ 发布者发送的消息则不能。

这里有更多细节和简化代码。

  • 操作系统:Ubuntu 18.04.5 LTS
  • C++ 20 (cppzmq 4.7.1)
  • Python 3.6.9 (pyzmq 22.0.3)

Python 订阅者

import zmq
import time

if __name__ == '__main__':

    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.bind("tcp://127.0.0.1:98765")
    socket.setsockopt_string(zmq.SUBSCRIBE, "")

    while True:
        print(socket.recv())
        time.sleep(1)

C++ Publisher(不工作)

#include <string>
#include <zmq.hpp>
#include <unistd.h>

using std::string;

int main() {

    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_PUB);
    socket.connect("tcp://127.0.0.1:98765");

    string pub_msg = "greetings from C++";
    zmq::message_t message_to_send(pub_msg.size());
    memcpy(message_to_send.data(), pub_msg.c_str(), pub_msg.size());
    socket.send(message_to_send, zmq::send_flags::dontwait);
    usleep(10*1000000);

}

Python Publisher(工作)

import zmq
import time

if __name__ == '__main__':

    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.connect("tcp://127.0.0.1:98765")

    while True:
        socket.send("greetings from Python")
        time.sleep(1)

我想让 Python 订阅者与 C++ 发布者一起工作。我已经尝试绑定 C++ 发布者并连接 Python 订阅者,但这也不起作用。

这里的一些方向会很有帮助。

谢谢 诺曼。

【问题讨论】:

  • 你有一个演员和memcpy(),删除它。如果编译失败,则代码已损坏。强制它编译不会使它正确,只会导致它在运行时失败。两者之间的另一个区别是,一个使用dontwait标志,并且在将要发送的数据排队后,它立即终止进程。
  • 谢谢乌尔里希。删除了对 memcpy(message_to_send.data(), pub_msg.c_str(), pub_msg.size()) 的强制转换;没有编译器错误,但仍然无法在 Python 端接收消息。此外,添加了 #include 和 usleep(10*1000) 以在终止之前提供一些缓冲区。这只是一个简化的代码;在实际的程序中,还有更多的事情发生,程序不会立即终止。

标签: python c++ zeromq c++20


【解决方案1】:

原来是这样的

Python

socket = context.socket(zmq.PULL)  # from context.socket(zmq.SUB)

C++

zmq::socket_t socket(context, ZMQ_PUSH);  // from socket(context, ZMQ_PUB)

帮助解决了我的问题。

我对此没有解释,但对于我的用例,应该这样做。

【讨论】:

    【解决方案2】:

    关于 C++ ZMQ_PUB 版本,它可能在 connect() 建立连接之前发送消息作为它的异步。

    如果没有建立连接,PUB 会丢弃消息,而 PUSH 会排队。

    尝试在连接和发送之间添加睡眠

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多