2017-10-18 6 views
2

ZeroMQ 가이드의 날씨 예를 epgm:// transport-class와 함께 사용하려고합니다. 첫째 내 코드에서 :tcp : //를 사용하여 epgm : //을 사용하여 메시지를 가져 오지 마십시오. 왜?

// Publisher 

#include "zhelpers.h" 

int main (void) { 
    // Prepare our context and publisher 
    void *context = zmq_ctx_new(); 
    void *publisher = zmq_socket (context, ZMQ_PUB); 
    // int rc = zmq_bind (publisher, "tcp://*:5556"); 
     int rc = zmq_bind (publisher, "epgm://192.168.1.4;224.0.0.251:5556"); 
    assert (rc == 0); 

    // Initialize random number generator 
    srandom ((unsigned) time (NULL)); 
    while (1) { 
     // Get values that will fool the boss 
     int zipcode, temperature, relhumidity; 
     zipcode  = randof (100000); 
     temperature = randof (215) - 80; 
     relhumidity = randof (50) + 10; 

     // Send a message to all subscribers 
     char update [20]; 
     sprintf (update, "%05d %d %d", zipcode, temperature, relhumidity); 
     s_send (publisher, update); 
    } 
    zmq_close (publisher); 
    zmq_ctx_destroy (context); 
    return 0; 
} 

// Subscriber 
    #include "zhelpers.h" 

    int main (int argc, char *argv []) 
    { 
     // Socket to talk to server 
     printf ("Collecting updates from weather server…\n"); 
     void *context = zmq_ctx_new(); 
     void *subscriber = zmq_socket (context, ZMQ_SUB); 
     // int rc = zmq_connect (subscriber, "tcp://192.168.1.4:5556"); 
      int rc = zmq_connect (subscriber, "epgm://192.168.1.9;224.0.0.251:5556"); 
     assert (rc == 0); 

     // Subscribe to zipcode, default is NYC, 10001 
     char *filter = (argc > 1)? argv [1]: "10001 "; 
     rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, 
           filter, strlen (filter)); 
     assert (rc == 0); 

     // Process 100 updates 
     int update_nbr; 
     long total_temp = 0; 
     for (update_nbr = 0; update_nbr < 100; update_nbr++) { 
      char *string = s_recv (subscriber); 

      int zipcode, temperature, relhumidity; 
      sscanf (string, "%d %d %d", 
        &zipcode, &temperature, &relhumidity); 
      total_temp += temperature; 
      free (string); 
     } 
     printf ("Average temperature for zipcode '%s' was %dF\n", 
      filter, (int) (total_temp/update_nbr)); 

     zmq_close (subscriber); 
     zmq_ctx_destroy (context); 
     return 0; 
    } 
  1. 나는 같은 호스트 (설명 참조)에 tcp://이 코드를 시도하고 그것을 잘 작동합니다.
  2. 멀티 캐스트 주소를 사용하여 (멀티 캐스트 주소로)이 예제 Openbook Linux을 시도했지만 메시지를 받았습니다.
  3. 나는 어설 션 오류가 발생하기 전에 pgm://과 함께 ZeroMQ를 설치했습니다.
  4. 내 호스트 모두 내 문제는 내가 epgm:// 어떤 메시지를 얻을 수 없다는 것입니다 내가 ZeroMQ 4

을 사용하고

  • 우분투 16.04 시스템입니다. 두 프로그램 모두 실행 중이었지만 메시지가 수신되지 않았습니다. 내가 뭘 놓치고 있니? 나는 무엇이 잘못 될 수 있는지 이해하지 못합니다.

  • +0

    코드가 저에게 효과적입니다. 메시지를받지 못했다는 것을 어떻게 확인 했습니까? zipcode 생성을 다음과 같이 변경하십시오.'zipcode = randof (100) + 9990;', 1/100000 hit 100 번 실제로 인쇄 할 때까지 어느 정도 시간이 걸릴 수 있습니다. 루프 안에 인쇄물을 추가하여 실제로 아무 것도받지 못하는지 확인하십시오. –

    +0

    늦어서 반갑습니다. 나는 여행하고 있었다. 나는 하나의 zipcode와 하나의 루프 만 추가하여 다시 시도했다. 그것은 놀랍습니다. 왜냐하면 양측이 꽤 오래 달리고 있었기 때문입니다. 오랫동안 삼중 한 후에 나는 시작에 실수를했을 수도 있습니다. 어쨌든 답변 해 주셔서 감사합니다 :-). – Runms

    답변

    0

    나중에 질문하는 방문자를 위해 코드는 정상적으로 작동하고 있습니다. 시스템에서 작동하는지 확인하려면 for 루프를 하나의 루프로 변경하고 인수없이 구독자를 시작한 경우 10001의 게시자에서 zipcode를 설정하십시오.