내 네트워크 계층에 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
을 보낼 수 있습니다.
내가 누락/잘못하고있는 것을 누구든지 볼 수 있습니까?
해야 내가 구분 기호
을 전송하는 방법에,하지만 당신은 아마 지금 질문을 단축한다 예제 코드는 필요 없으며 실제 문제가 무엇인지 구체적으로 설명해야합니다. – JSON