【发布时间】: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) 以在终止之前提供一些缓冲区。这只是一个简化的代码;在实际的程序中,还有更多的事情发生,程序不会立即终止。