2016-09-02 2 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_t* zsock_new_sub (const char *endpoints, const char *subscribe) 

또는 후 구독을 만들 : 가입 걸리는 변형을 사용해보십시오

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

빈 문자열은 모든 것을 등록합니다.

+0

zmq 핸들 (void * 유형)은 'zsock_t'구조 내에 캡슐화되어 있으므로 이에 대한 액세스 권한이 없으므로 'zmq_setsockopt'의 사용법은 문제가 아닙니다. 아래 코드를 참조하십시오 https://github.com/zeromq/czmq/blob/master/src/zsock.c 여기에 'zmq 용 c 바인딩'을 사용하려고합니다. ZMQ 아티팩트는 'czmq'유형으로 캡슐화됩니다. –

+0

더 많은 czmq 특정 답변을 업데이트했습니다. – David

+0

수정 해 주셔서 감사합니다, 지금 작동, 문제는 확실히 당신이 지적한대로 'zsock_set_subscribe'의 부재였습니다. 이 외에도 또 다른 문제가있었습니다. 구독자가 연결할 수있는 기회를 갖기 전에 게시자가 메시지를 보내곤했기 때문에 메시지가 손실 될 수 있습니다. 구독자는 결코 오지 않을 메시지를 계속 기다리게됩니다. 게시자 앞에 구독자를 초기화하고 게시자 초기화 직후에 약간의 지연 (예 : 1 초)을 추가하면 구독자가 연결되어 결국 메시지를받을 수있는 충분한 시간이 제공됩니다. –

0

위의 프로그램에는 두 가지 문제점이 있습니다.

  1. @david가없는 'zsock_set_subscribe'가 없다는 것은 이전 주석에서 지적하고 있습니다.
  2. 게시자는 구독자가 연결할 기회를 갖기 전에 메시지를 보내므로 메시지가 손실되고 구독자는 절대 오지 않을 메시지를 계속 기다립니다.

해결 방법 : 가입자 소켓 후 'zsock_set_subscribe'를 추가

  1. 초기화 입니다.
  2. 구독자를 초기화하고 게시자 바로 뒤에 작은 지연 (예 : 1 초)을 추가하여 구독자가 연결할 수있는 충분한 시간을 제공하고 결국 메시지를 수신합니다.
관련 문제