2016-05-22 23 views
3

最近、Pupilアイトラッカーで新しいプロジェクトを開始しました。追加のクライアントに追跡情報をブロードキャストするには、ZeroMQを使用します。私は自分のサーバーが正しく彼らのシンプルなPythonクライアントの例を試みることによって実行されていることを確認しました:ZeroMQ C++クライアントが受信していません

import zmq 
import json 

#network setup 
port = "5000" 
context = zmq.Context() 
socket = context.socket(zmq.SUB) 
socket.connect("tcp://127.0.0.1:"+port) 

# recv all messages 
socket.setsockopt(zmq.SUBSCRIBE, '') 

while True: 
    topic = socket.recv_multipart() 
    #msg = json.loads(topic) 
    print "\n\n",topic[0] #,":\n",msg 

私のプロジェクトは、私はこのようなZeroMQ例使用してC++でそれを翻訳しようとしているC++でなければなりませんので:

#include "zmq.hpp" 
#include <string> 
#include <iostream> 

int main() 
{ 
    // Prepare our context and socket 
    zmq::context_t context(1); 
    zmq::socket_t socket(context, ZMQ_SUB); 

    std::cout << "Connecting to hello world server" << std::endl; 
    socket.connect("tcp://127.0.0.1:5000"); 

    socket.setsockopt(ZMQ_SUBSCRIBE, ""); 

    // Do 100 requests, waiting each time for a response 
    for (int request_nbr = 0; request_nbr != 100; request_nbr++) { 

     // Get the message. 
     zmq::message_t msg; 
     socket.recv(&msg); 
     std::cout << "Received World " << msg.data() << std::endl; 
    } 
    return 0; 
} 

残念ながら、これは動作しません.C++クライアントはsocket.recv(& msg)でハングアップします。それが決して受け取らないメッセージを待っている。

私はVisual Studio 2013と、ZeroMQインストールに付属のZeroMQライブラリlibzmq-v120-mt-4_0_4.libを使用しています(私はそれをコンパイルしませんでした)。それを設定するために私はthisチュートリアルを使用しました。

私が使用する構成はx64ですが、瞳孔は32ビットですが、私は誤解しない限り、これはZeroMQとは関係ありません。

瞳孔はpyzmqを使用します。これは4.04 zmq libと互換性があります。

+0

あなたは生徒のpyzmqが_really_ zmq 4.0.4を使用しているかどうかを確認することをお勧めします。個人的に私は以前のバージョン間で互換性の問題がありました(クラッシュさえも)ので、実際のバージョンを確認することをお勧めします。 – mindriot

+0

生徒は、4.1.x zmqをサポートするはずのpyzmq-14.7.0をお勧めします。これは私が見つけることができる情報です。私は彼らのlibzmq.pydファイルを見ることができますが、私はバージョンを確認することはできないと思います。価値のあるものについては、実行中のPythonクライアントは実際に最新のpyzmqを使用しています。pyzmq-15.2.0-cp27 – Elena

+1

[this](http://zguide.zeromq.org/py:version)のようなバージョンを確認できます – mindriot

答えて

2

私には未知の何らかの理由で、ラッパーzmq.hppが私のケースで動作していません。私にとって問題solcerこのヘルパーを使用していませんbookからのソリューションを使用すると、

int main(int argc, char *argv[]) 
{ 
    void *context = zmq_ctx_new(); 

    // Socket to talk to server 
    void *subscriber = zmq_socket(context, ZMQ_SUB); 
    int rc = zmq_connect(subscriber, "tcp://127.0.0.1:5000"); 
    assert(rc == 0); 

    rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", strlen("")); 
    assert(rc == 0); 

    // Process 100 updates 
    int update_nbr; 
    long total_temp = 0; 
    for (update_nbr = 0; update_nbr < 100; update_nbr++) { 
     char msg[256]; 
     rc = zmq_recv(subscriber, msg, 256, 0); 
     std::cout << "Received World " << msg << std::endl; 
    } 

    zmq_close(subscriber); 
    zmq_ctx_destroy(context); 
    return 0; 
} 
関連する問題