ZeroMQ REQ/REP:REP 必须发回一些东西吗?
ZeroMQ REQ/REP: must REP send something back?
我正在使用 ZeroMQ 的模式 REQ
/REP
。
通常这种模式是这样工作的:
REP.bind(localhost with a port)
REQ.connect(localhost with the same port)
REQ sends a REQ-message to REP
REP sends a REP-message to REQ back
现在,我想删除最后一步。
意思是 REP
不发回任何东西,它只接收来自 REQ
的消息。
我知道有另一个名为 PUB
/SUB
的模式可以做到这一点,但我只想使用 REQ
/REP
.
这是我的代码:
// REQ
int main()
{
void *context = zmq_ctx_new();
void *requester = zmq_socket(context, ZMQ_REQ);
zmq_connect(requester, "tcp://localhost:5555");
const char * msgSent = "I'm agent";
zmq_send(requester, msgSent, strlen(msgSent), 0);
zmq_close(requester);
zmq_ctx_destroy(context);
system("pause");
return 0;
}
// REP
int main()
{
void *context = zmq_ctx_new();
void *responder = zmq_socket(context, ZMQ_REP);
zmq_bind(responder, "tcp://*:5555");
while (true) {
char buffer[50] = {'[=12=]'};
cout << "receiving..." << endl;
zmq_recv(responder, buffer, 50, 0);
cout << buffer << endl << "end";
}
system("pause");
return 0;
}
我先运行 REP
,控制台会显示"receiving...",表示正在等待消息
我运行REQ
,发送消息给REQ
.
之后,REP
的控制台将显示 "I'm agent",但 while
将继续显示。 zmq_recv
似乎是非阻塞的。
本以为收到"I'm agent"就会停止,结果没有。但是如果我让 REP 把东西发回 REQ
,一切都会好起来的。
为什么?
必须 REP
寄回一些东西?
ZeroMQ 是一个非常聪明且非常强大的乐高式工具箱
不过,它无法按照您的要求提供东西。如果有某种原因需要开发一个高度可扩展的正式通信模式,模仿 REQ
-询问/REP
-回复,那么 ZeroMQ 架构背后就有这个主要原因,为什么你试图得到除此之外的其他东西预期的行为必须失败。
是,REQ
-询问并主要等待,直到REP
-回复是REQ
-读入
对于正式的非规定点对点行为,可以实施PAIR
/PAIR
正式的通信模式并享受充分的自由。
最好的下一步是什么?
我能为你进一步的问题做的是指导你看一个 bigger picture on this subject 有更多的参数,一个简单的信号平面/消息平面插图和一个直接的 link 必须-阅读 Pieter HINTJENS 的书。
我正在使用 ZeroMQ 的模式 REQ
/REP
。
通常这种模式是这样工作的:
REP.bind(localhost with a port)
REQ.connect(localhost with the same port)
REQ sends a REQ-message to REP
REP sends a REP-message to REQ back
现在,我想删除最后一步。
意思是 REP
不发回任何东西,它只接收来自 REQ
的消息。
我知道有另一个名为 PUB
/SUB
的模式可以做到这一点,但我只想使用 REQ
/REP
.
这是我的代码:
// REQ
int main()
{
void *context = zmq_ctx_new();
void *requester = zmq_socket(context, ZMQ_REQ);
zmq_connect(requester, "tcp://localhost:5555");
const char * msgSent = "I'm agent";
zmq_send(requester, msgSent, strlen(msgSent), 0);
zmq_close(requester);
zmq_ctx_destroy(context);
system("pause");
return 0;
}
// REP
int main()
{
void *context = zmq_ctx_new();
void *responder = zmq_socket(context, ZMQ_REP);
zmq_bind(responder, "tcp://*:5555");
while (true) {
char buffer[50] = {'[=12=]'};
cout << "receiving..." << endl;
zmq_recv(responder, buffer, 50, 0);
cout << buffer << endl << "end";
}
system("pause");
return 0;
}
我先运行 REP
,控制台会显示"receiving...",表示正在等待消息
我运行REQ
,发送消息给REQ
.
之后,REP
的控制台将显示 "I'm agent",但 while
将继续显示。 zmq_recv
似乎是非阻塞的。
本以为收到"I'm agent"就会停止,结果没有。但是如果我让 REP 把东西发回 REQ
,一切都会好起来的。
为什么?
必须 REP
寄回一些东西?
ZeroMQ 是一个非常聪明且非常强大的乐高式工具箱
不过,它无法按照您的要求提供东西。如果有某种原因需要开发一个高度可扩展的正式通信模式,模仿 REQ
-询问/REP
-回复,那么 ZeroMQ 架构背后就有这个主要原因,为什么你试图得到除此之外的其他东西预期的行为必须失败。
是,REQ
-询问并主要等待,直到REP
-回复是REQ
-读入
对于正式的非规定点对点行为,可以实施PAIR
/PAIR
正式的通信模式并享受充分的自由。
最好的下一步是什么?
我能为你进一步的问题做的是指导你看一个 bigger picture on this subject 有更多的参数,一个简单的信号平面/消息平面插图和一个直接的 link 必须-阅读 Pieter HINTJENS 的书。