2017-01-30 2 views
3

マイ(パイソン)出版社:(GTESTで実行している)私のC++ ZeroMQ加入者は何のデータも受け取らないのですか?

import zmq 
import time 

context = zmq.Context() 
socket = context.socket(zmq.PUB) 
connectStr = "tcp://*:%d" % 5563 
socket.bind(connectStr) 

messageNum = 0 
while True: 
    ++messageNum 
    message = "Testing %d"%messageNum 
    print("Sending.. '%s'"%message) 
    socket.send_string(message) 
    time.sleep(1) 
    messageNum += 1 

マイ(C++)加入者:

TEST(ZeroMqPubSubTest, SubscribeGetsData) 
{ 

    // Set up the subscriber we'll use to receive the message. 
    zmq::context_t context; 
    zmq::socket_t subscriber(context, ZMQ_SUB); 
    // Connect to the publisher 
    subscriber.connect("tcp://127.0.0.1:5563"); 
    subscriber.setsockopt(ZMQ_SUBSCRIBE, ""); // Set the filter blank so we receive everything 

    zmq::message_t response(0); 
    EXPECT_TRUE(subscriber.recv(&response)); 
} 

私は加入者を起動し、その後、パブリッシャを起動します。後者は決して戻ってこない。

私は正常に動作..itやっPythonの加入者(私は思った)まったく同じこと..

import zmq 

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

print ("Waiting for data...") 
while True: 
    message = socket.recv() 
    print ("Got some data:",message) 

実行する場合:

データを待っているの...

いくつかのデータがあります:b'Testing 8 '

いくつかのデータがあります:b'Testing 9'

答えて

2

zmq.hppで定義されたsetsockoptの2つのオーバーロードがあります。

template<typename T> void setsockopt(int option_, T const& optval) 
{ 
    setsockopt(option_, &optval, sizeof(T)); 
} 

inline void setsockopt (int option_, const void *optval_, size_t optvallen_) 
{ 
    int rc = zmq_setsockopt (ptr, option_, optval_, optvallen_); 
    if (rc != 0) 
     throw error_t(); 
} 

あなたは暗黙的にはsizeof(T)の値の長さを想定して最初のオーバーロードを使用する唯一の二つの引数を提供することにより。これは、""がゼロ終端文字配列であるため、1に解決されます。 @kazemakase上

char none[0]; 
subscriber.setsockopt(ZMQ_SUBSCRIBE, none); 
+0

スポット:ゼロサイズのデータ​​型を使用し、また

subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0); 

:空の文字列を渡すために、あなたは、2番目のオーバーロードを使用し、0の長さを指定する必要があります。私はまだZeroMQで微妙なことを学んでいますが、特にcppインターフェイスにはいくつかの問題点があります。 –

関連する問題