2016-09-02 13 views
2

「libczmq」を使用してPublisher/Subscriberコミュニケーションを示す簡単なプログラムを作成しようとしています。私は 'zmsg_send' APIを介してメッセージを送信することはできますが(またはその戻り値に基づいて推測します)、 'zmsg_recv'(ブロッキング)APIを介してメッセージを受け取ることができません。メッセージ。CZMQ:メッセージを受け取ることができません

#include "czmq.h" 
int main (void) 
{ 
    int rc; 
    const char *ipc_file="ipc://tmp.socket"; 
    const char *str = "Hello World!!!"; 

    /*****************************************/ 
    /* Creating and binding publisher Socket */ 
    /*****************************************/ 
    zsock_t *pub_sock = zsock_new(ZMQ_PUB); 
    assert(pub_sock!=NULL); 
    rc = zsock_bind(pub_sock, ipc_file, NULL); 
    assert(rc==0); 

    /**************************************************/ 
    /* Creating and connecting with Subscriber Socket */ 
    /**************************************************/ 
    zsock_t *sub_sock = zsock_new(ZMQ_SUB); 
    assert(sub_sock); 
    rc = zsock_connect(sub_sock, ipc_file, NULL); 
    assert(rc==0); 

    /***************************************/ 
    /* Creating messager & Frame instances */ 
    /*   and sending message   */ 
    /***************************************/ 
    zmsg_t *msg = zmsg_new(); 
    assert(msg!=NULL); 
    zframe_t *frame = zframe_new (str, strlen(str)); 
    assert(frame!=NULL); 
    zmsg_prepend(msg, &frame); 
    printf("PUB : frame_count = %u, content_size = %d, msg_ptr = %p\n", 
     zmsg_size (msg), zmsg_content_size(msg), msg); 
    rc = zmsg_send(&msg, pub_sock); 
    assert (rc == 0); 
    printf("PUB : Message send successfully...\n"); 

    /********************************/ 
    /* Subscriber receiving message */ 
    /********************************/ 
    printf("SUB : Reading message...\n"); 
    msg = zmsg_recv(sub_sock); 
    assert(msg!=NULL); 
    printf("SUB : frame_count = %u, content_size = %d, msg_ptr = %p\n", 
     zmsg_size (msg), zmsg_content_size(msg), msg); 
    frame = zmsg_pop(msg); 
    assert(frame!=NULL); 
    printf("SUB : received in frame = \"%s\"\n", zframe_data (frame)); 

    zmsg_destroy (&msg); 
    zframe_destroy (&frame); 
    zsock_destroy (&sub_sock); 
    zsock_destroy (&pub_sock); 
    return 0; 
} 

以下は、アプリケーションの構築方法と実行方法です。

[email protected]:~/progs/czmq$ make 
cc -Iczmq/include -ggdb -c -o pub-sub-test.o pub-sub-test.c 
gcc -L./czmq/src/.libs -lzmq -lczmq -lpthread pub-sub-test.o -o ../pub-sub-test 
[email protected]:~/progs/czmq$ ../pub-sub-test 
PUB : frame_count = 1, content_size = 14, msg_ptr = 0x1653b10 
PUB : Message send successfully... 
SUB : Reading message... 

「メッセージ」は決して加入者によって読み取られません。私がここで紛失していることを教えてください。

答えて

0

デフォルトでは、SUBソケットにサブスクリプションはありません。空の文字列はすべてに加入して

zsock_set_subscribe (void *zsock, const char *subscribe); 

:後

zsock_t* zsock_new_sub (const char *endpoints, const char *subscribe) 

またはサブスクリプションを作成します。サブスクリプションをとるバリアントを使用してみてください。

+0

zmqハンドル(型void *)は、 'zsock_t'構造体にカプセル化されていますので、 'zmq_setsockopt'の使用は問題ありません。以下のコードを参照してください https://github.com/zeromq/czmq/blob/master/src/zsock.c ここで私はczmq(zmq用のcバインディング)を使用しようとしています。 ZMQの成果物は 'czmq'タイプ内にカプセル化されています。 –

+0

回答が更新されましたmore czmq特定 – David

+0

訂正してくれてありがとう、それは今、問題は間違いなくあなたが指摘したように 'zsock_set_subscribe'の不在だった。これに加えて別の問題がありました。サブスクライバが接続する機会がある前にパブリッシャがメッセージを送信していたため、メッセージが失われてしまい、サブスクライバは決して来ないメッセージを待っていました。 パブリッシャの前でサブスクライバを初期化し、パブリッシャの初期化直後に小さな遅延(たとえば1秒)を追加すると、サブスクライバが接続して最終的にメッセージを受信するのに十分な時間が与えられます。 –

0

上記のプログラムには2つの問題があります。

  1. @davidとして 'zsock_set_subscribe'が存在しないということは、以前のコメントで指摘されています。
  2. パブリッシャは、サブスクライバが接続する機会を得る前にメッセージを送信するため、メッセージが失われ、サブスクライバは決して来ないメッセージを待っています。

ソリューション:加入者ソケットの後に 'zsock_set_subscribe' を追加

  1. は初期化さ です。
  2. パブリッシャの前にサブスクライバを初期化し、 パブリッシャのすぐ後に小さな遅延(たとえば1秒)を追加して、サブスクライバが接続するのに十分な時間を提供し、最後に にメッセージを受信します。
関連する問題