2016-06-17 116 views
0

我在c++(使用zhelpers.hpp)和python3 ZeroMQ订户的ZeroMQ发布者(使用pyzmq)。ZMQ蟒发布C++订阅

问题是,用户没有收到消息。我想,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的订户workking罚款。代码:

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() 
+0

您能否确认'py3'和'C++'是否使用相同版本的ZeroMQ API规范?最近在消息头大小/映射中的移动可能会使旧版本的'C++'绑定行为失效。 – user3666197

+0

是的,你说得对,版本不匹配。 –

+0

**很高兴帮助**。随意访问**享受**其他**'ZeroMQ'答案** >>> http://stackoverflow.com/search?tab=votes&q=user%3a3666197%20%5bzeromq%5d – user3666197

回答

0

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

0

docssetsockopt的最后一个参数是期权价值的长度。在你的情况下,你传递的字符串的长度作为过滤器值。

正如你在8中所说的那样,长度为C++将会读取8个字符,但是你的过滤字符串只有4个字符长。这导致包含一些随机数据的过滤器。如果你很幸运,过滤器有时会匹配,但它非常不灵活。

更改方法调用此:

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

你想C++为只读还有什么,而不是更多。

+0

这是有道理的。 Hower用户仍然没有得到任何东西。 –

+0

如果您删除了订阅电话,您会收到什么吗? (默认订阅是所有消息) – David

+0

所以我删除了这一行:'subscriber1.setsockopt(ZMQ_SUBSCRIBE,“CALL”,4);'。仍然没有... –