2014-01-23 3 views
5

내 네트워크 계층에 ZeroMQ를 사용하고 있으며, ROUTER 소켓을 제외하고는 모든 것이 작동합니다. 특히 ROUTER에서 예상 메시지를 수신하지만 REQ 소켓에 응답을 보내려고하면 메시지가 수신되지 않습니다.ZMQ C++ 라우터 문제 발생

여기는 ROUTER에게 "HELLO"메시지를 보내고 메시지가 다시 오기를 기대하는 비교적 간단한 테스트입니다. 여기

클라이언트 코드 : 여기

try 
    { 
     zmq::context_t myContext; 

     zmq::socket_t reqSocket(myContext, ZMQ_REQ); 
     reqSocket.setsockopt(ZMQ_IDENTITY, "REQ", 3); 
     reqSocket.connect(gpRouterAddress); 

     //request delimiter 
     zmq::message_t zmqMsgReqDelimiter(1); 
     memcpy ((void *) zmqMsgReqDelimiter.data(), "\0", 1); 
     reqSocket.send(zmqMsgReqDelimiter, ZMQ_SNDMORE); 

     //some message 
     zmq::message_t reqMsg(5); 
     memcpy ((void *) reqMsg.data(), "HELLO", 5); 
     reqSocket.send(reqMsg, 0); 

     int rcvMore = 0; 
     size_t sizeInt = sizeof(int); 
     bool bRcvMore = true; 
     std::vector<std::string> history; 

     while(bRcvMore) 
     { 
      zmq::message_t zmqMsg; 

      reqSocket.recv(&zmqMsg, rcvMore); 
      const char* pMsgStr = static_cast<char*>(zmqMsg.data()); 
      history.push_back(pMsgStr); 

      reqSocket.getsockopt(ZMQ_RCVMORE, &rcvMore, &sizeInt); 

      bRcvMore = (rcvMore == 1); 
     } 
    } 
    catch (zmq::error_t error) 
    { 
     std::string errorStr = error.what(); 
    } 

및 내 라우터 (theContext 위의 코드에서 "myContext"와 같은 것이있는 경우에 다른 스레드에서 실행할 수있는) 코드 또는 전적으로 다른 응용 프로그램 :

try 
    { 
     zmq::context_t theContext; 

     zmq::socket_t router (theContext, ZMQ_ROUTER); 
     int value = 1; 
     router.setsockopt(ZMQ_ROUTER_MANDATORY, &value, sizeof(int)); 
     router.setsockopt(ZMQ_IDENTITY, "ROUT", 4); 
     router.bind(gpRouterAddress); 

     zmq::message_t zmqMsgInternalAddress; 
     router.recv(&zmqMsgInternalAddress, 0); 
     const char* pAddressStr = static_cast<char*>(zmqMsgInternalAddress.data()); 

     zmq::message_t zmqMsgDelimiter; 
     router.recv(&zmqMsgDelimiter, ZMQ_RCVMORE); 
     const char* pDelimiterStr = static_cast<char*>(zmqMsgDelimiter.data()); 

     int rcvMore = 0; 
     size_t sizeInt = sizeof(int); 
     bool bRcvMore = true; 

     router.getsockopt(ZMQ_RCVMORE, &rcvMore, &sizeInt); 
     bRcvMore = (rcvMore == 1); 

     std::vector<std::string> history; 

     while(bRcvMore) 
     { 
      zmq::message_t zmqMsg; 

      router.recv(&zmqMsg, rcvMore); 
      const char* pMsgStr = static_cast<char*>(zmqMsg.data()); 
      history.push_back(pMsgStr); 

      router.getsockopt(ZMQ_RCVMORE, &rcvMore, &sizeInt); 

      bRcvMore = (rcvMore == 1); 
     } 


     //reply address 

     size_t len = strlen(pAddressStr) - 1; //if I don't subtract 1 char here, an exception will be raised 

     zmq::message_t replyAddress(len); 
     memcpy ((void *) replyAddress.data(), pAddressStr, len); 
     router.send(replyAddress, ZMQ_SNDMORE); 

     //reply delimiter 
     zmq::message_t zmqMsgReplyDelimiter(1); 
     memcpy ((void *) zmqMsgReplyDelimiter.data(), "\0", 1); 
     router.send(zmqMsgReplyDelimiter, ZMQ_SNDMORE); 

     //some message 
     zmq::message_t replyMsg(5); 
     memcpy ((void *) replyMsg.data(), "WORLD", 5); 
     router.send(replyMsg, 0); 

    } 
    catch (zmq::error_t error) 
    { 
     std::string errorStr = error.what(); 
    } 

내가 라우터의 "HELLO"메시지가 나타납니다 내가 라우터 전송을 단계별로 할 수 있으며 모든 (예외가 제기되고 있지 예) 괜찮 전송하는 것 같지만 나는 결코에 메시지가 나타날 무한정 기다리는 REQ 소켓.

REQ 소켓

empty 
HELLO 

라우터가

REQ 
empty 
HELLO 

를 수신하지만

를받을 보냅니다

ZeroMQ 가이드에 따르면 나는 라우터는 다음과 같은 메시지를받을 것으로 예상한다

REQ 
some binary message 
empty 
HELLO 

나는 내가 (간단한 REQ-REP 토폴로지 모든 것이 잘 작동 사용) 대신 REP 소켓에 연결하는 경우

empty 
WORLD 

로 REQ에 도착 기대

REQ 
empty 
WORLD 

을 보낼 수 있습니다.

내가 누락/잘못하고있는 것을 누구든지 볼 수 있습니까?

+0

해야 내가 구분 기호

zmq::message_t zmqMsgReplyDelimiter(1); memcpy ((void *) zmqMsgReplyDelimiter.data(), "\0", 1); router.send(zmqMsgReplyDelimiter, ZMQ_SNDMORE); 

을 전송하는 방법에,하지만 당신은 아마 지금 질문을 단축한다 예제 코드는 필요 없으며 실제 문제가 무엇인지 구체적으로 설명해야합니다. – JSON

답변

5

문제점을 발견했습니다.

기본적으로 오류는 바로이 같은 실수를 다른 사람에게 유용 할 수

zmq::message_t zmqMsgReplyDelimiter(0); 
    router.send(zmqMsgReplyDelimiter, ZMQ_SNDMORE);