2014-07-06 2 views
2

ZeroMQ를 사용하여 게시자와 가입자 네트워크를 하나씩 구현했습니다. 구독자가 게시자에게 데이터를 보낼 수 있기를 원하기 때문에 XPUB와 XSUB를 사용했습니다. 내 코드는 구독자가 게시자로부터 데이터를받을 수 있음을 의미하는 XPUB + SUB에서 작동합니다. 그러나 XPUB + XSUB에서는 작동하지 않습니다. 이것은 아마도 "setsockopt (ZMQ_SUBSCRIBE, ...)"를 수행 할 수 없기 때문일 수 있습니다. 런타임에 항상 "잘못된 인수"오류가 발생합니다. 여기 내 코드는 다음과 같습니다.ZeroMQ, XSUB가 수신되지 않음

/* Code */ 
zmq::context_t context (1); 

// Socket to talk to server 
std::cout << "Collecting updates from weather server...\n" << std::endl; 
zmq::socket_t subscriber (context, ZMQ_XSUB); 
subscriber.connect("tcp://localhost:5556"); 

char *filter = "10001 "; 
subscriber.setsockopt(ZMQ_SUBSCRIBE, filter, strlen (filter)); 
/* 
zmq::message_t msg(10); 
sprintf ((char *) msg.data(), "%05d %d %d", 1, 2, 3); 
std::cout << "To Send from SUB" << std::endl; 
subscriber.send(msg); 
std::cout << "Send from SUB" << std::endl; 
*/ 
// Process 100 updates 
int update_nbr; 
long total_temp = 0; 
for (update_nbr = 0; update_nbr < 10; update_nbr++) { 

    zmq::message_t update; 
    int zipcode, temperature, relhumidity; 

    subscriber.recv(&update); 

    std::istringstream iss(static_cast<char*>(update.data())); 
    iss >> zipcode >> temperature >> relhumidity ; 

    total_temp += temperature; 
} 
std::cout << "Average temperature for zipcode '" 
      <<"' was "<<(int) (total_temp/update_nbr) <<"F" 
      << std::endl; 

subscriber.setsockopt를 설정하는 방법에있어 잘못된 점은 무엇입니까? XSUB를 SUB로 대체하면 작동합니다. 그러나 코드에서 subscribe.send (msg)를 수행 할 수 없습니다. 대신 보내 사용해야하고 메시지의 첫 번째 바이트는 필터 변수를 보내 귀하의 경우 1.

을 할 수 있지만 값과 필터의 시작에 바이트를 추가해야 가입에 대한 setsockopt를 사용의

답변

2

1 (ascci '1'이 아니라 단지 1).

관련 문제