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 的书。