2013-05-07 3 views
5

다음 코드를 실행하면 zmq_poll으로 첫 번째 호출에서 오류가 발생합니다 (즉, -1을 반환 함). zmq_errno()128을 반환하고 zmr_strerror(128) 호출은 "Unknown error"을 반환합니다. 나는 ZMQ를 C++과 함께 아무런 문제없이 잠시 사용 해왔다. 아무리 간단한지라도 zmq_poll을 호출 할 수는 없다.ZMQ 폴링이 작동하지 않습니다.

zmq::version을 호출하면 ZMQ 버전 2.1.10이 사용 중임을 알 수 있습니다.

zmq_poll이 실패한 이유는 누구입니까?

#include <zmq/zmq.hpp> 

int main(int argc, char* argv[]) 
{ 
    zmq::context_t context(1); 
    zmq::socket_t repA(context, ZMQ_REP); 
    zmq::socket_t repB(context, ZMQ_REP); 
    repA.bind("tcp://127.0.0.1:5555"); 
    repB.bind("tcp://127.0.0.1:5556"); 
    zmq::pollitem_t items[] = 
    { 
     { &repA, 0, ZMQ_POLLIN, 0 }, 
     { &repB, 0, ZMQ_POLLIN, 0 } 
    }; 
    while (true) 
    { 
     int rc = zmq_poll(items, 2, 1000); 
     if (rc < 0) 
     { 
      int code = zmq_errno(); //code = 128 
      auto message = zmq_strerror(code); //message = "Unknown error" 
     } 
    } 
} 
+1

errno의 값은 무엇입니까? _Upon 실패, zmq_poll()은 -1을 반환하고 아래 정의 된 값들 중 하나에 errno를 설정합니다. _ http://api.zeromq.org/2-1:zmq-poll – flup

+0

@flup 이제'zmq_poll' doesn (실제로는'-1'로 신호를 보낸다.) 그리고 실제 에러 번호를 얻기 위해서는'zmq_errno()'를 호출해야한다. 이 작업을 수행하면 오류 번호가 128이됩니다. (업데이트 된 질문) –

+1

_ zmq_pollitem_t 구조에서 사용할 ØMQ 소켓을 얻으려면 socket_t 클래스의 인스턴스를 (void *) _로 캐스팅해야합니다. 그래서 나는 그 주소를 보내는 대신에'repA'를 사용해야한다고 생각합니다. – flup

답변

4

가 zmq_pollitem_t 구조에 사용하기 위해 ØMQ 소켓을 얻으려면, 당신은 (* 무효)에 socket_t 클래스의 인스턴스를 캐스팅해야한다.

따라서는 &없이

zmq::pollitem_t items[] = 
{ 
    { repA, 0, ZMQ_POLLIN, 0 }, 
    { repB, 0, ZMQ_POLLIN, 0 } 
}; 

해야한다.