ZeroMQ REQ / REP:必须REP发回一些东西吗?

时间:2015-09-25 14:08:08

标签: zeromq

我使用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] = {'\0'};
        cout << "receiving..." << endl;
        zmq_recv(responder, buffer, 50, 0);
        cout << buffer << endl << "end";
    }    
    system("pause");
    return 0;
}

我首先运行REP,它会显示&#34;接收...&#34;在控制台上,这意味着它正在等待某些消息 我运行REQ,向REQ发送消息。

之后,REP的控制台将显示&#34;我是代理商&#34;然后while将继续。似乎zmq_recv是非阻塞的。

我认为收到&#34;我是代理商后会停止&#34;但它没有。但如果我让REP将某些内容发回REQ,一切都会好的。

WHY吗

必须REP发回一些东西吗?

1 个答案:

答案 0 :(得分:1)

ZeroMQ是一款非常智能且非常强大的LEGO风格工具箱

但是,它无法提供你所要求的东西。如果有理由开发一种高度可扩展的正式沟通模式,模仿REQ - 询问/ REP - 回复,那么ZeroMQ架构背后有这个主要原因,为什么你试图得到除此之外的其他预期的行为只是必须失败。

是的,REQ - 询问并主要等待,直到REP - 回复为REQ - 读入

对于正式的非规定的点对点行为,可以实施PAIR / PAIR正式沟通模式,享受充分的自由。

最好的下一步?

我可以为你的进一步问题做些什么,可以指导你看到一个bigger picture on this subject更多参数,一个简单的信号平面/消息平面插图,以及一个必读书的直接链接,来自Pieter HINTJENS