zmq python 发布 C++ 订阅
zmq python publish c++ subscribe
我在 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()
来自docs:
setsockopt
的最后一个参数是选项值的长度。在您的情况下,您作为过滤器值传递的字符串的长度。
正如你在 8
中输入的那样,C++ 将读取 8 个字符,但你的过滤器字符串只有 4 个字符长。这导致包含一些随机数据的过滤器。如果幸运的话,过滤器有时会匹配,但不太可能。
将方法调用更改为:
subscriber1.setsockopt( ZMQ_SUBSCRIBE, "CALL", 4);
您希望 C++ 只读取其中的内容,而不是更多。
我最终使用 zhelpers.h 切换到 C。我必须将 libzmq-dev 更新到版本 > 3.2。我在 zguide 上使用了示例:zmq subscriber in c
我在 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()
来自docs:
setsockopt
的最后一个参数是选项值的长度。在您的情况下,您作为过滤器值传递的字符串的长度。
正如你在 8
中输入的那样,C++ 将读取 8 个字符,但你的过滤器字符串只有 4 个字符长。这导致包含一些随机数据的过滤器。如果幸运的话,过滤器有时会匹配,但不太可能。
将方法调用更改为:
subscriber1.setsockopt( ZMQ_SUBSCRIBE, "CALL", 4);
您希望 C++ 只读取其中的内容,而不是更多。
我最终使用 zhelpers.h 切换到 C。我必须将 libzmq-dev 更新到版本 > 3.2。我在 zguide 上使用了示例:zmq subscriber in c