'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 여기에 'zmq 용 c 바인딩'을 사용하려고합니다. ZMQ 아티팩트는 'czmq'유형으로 캡슐화됩니다. –
더 많은 czmq 특정 답변을 업데이트했습니다. – David
수정 해 주셔서 감사합니다, 지금 작동, 문제는 확실히 당신이 지적한대로 'zsock_set_subscribe'의 부재였습니다. 이 외에도 또 다른 문제가있었습니다. 구독자가 연결할 수있는 기회를 갖기 전에 게시자가 메시지를 보내곤했기 때문에 메시지가 손실 될 수 있습니다. 구독자는 결코 오지 않을 메시지를 계속 기다리게됩니다. 게시자 앞에 구독자를 초기화하고 게시자 초기화 직후에 약간의 지연 (예 : 1 초)을 추가하면 구독자가 연결되어 결국 메시지를받을 수있는 충분한 시간이 제공됩니다. –