「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...
「メッセージ」は決して加入者によって読み取られません。私がここで紛失していることを教えてください。
zmqハンドル(型void *)は、 'zsock_t'構造体にカプセル化されていますので、 'zmq_setsockopt'の使用は問題ありません。以下のコードを参照してください https://github.com/zeromq/czmq/blob/master/src/zsock.c ここで私はczmq(zmq用のcバインディング)を使用しようとしています。 ZMQの成果物は 'czmq'タイプ内にカプセル化されています。 –
回答が更新されましたmore czmq特定 – David
訂正してくれてありがとう、それは今、問題は間違いなくあなたが指摘したように 'zsock_set_subscribe'の不在だった。これに加えて別の問題がありました。サブスクライバが接続する機会がある前にパブリッシャがメッセージを送信していたため、メッセージが失われてしまい、サブスクライバは決して来ないメッセージを待っていました。 パブリッシャの前でサブスクライバを初期化し、パブリッシャの初期化直後に小さな遅延(たとえば1秒)を追加すると、サブスクライバが接続して最終的にメッセージを受信するのに十分な時間が与えられます。 –