ZeroMQ (C):基本的请求-回复问题

ZeroMQ (C): Basic request-reply issue

考虑以下请求-回复设置的最小示例:

服务器:

// Minimal example request & reply (REQ-REP)
// SERVER

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void) {
    //  Socket to talk to clients
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0);

    while (1) {
         char buffer [2];
         zmq_recv (responder, buffer, 2, 0);
         printf ("Received: %s\n",buffer);
    }
    return 0;
}

客户:

// Minimal example request & reply (REQ-REP)
// CLIENT

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void) {
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");
    zmq_send (requester, "0", 2, 0);
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

结果如下:

Received: 0
Received: 0
...

..并永远在标准输出中打出这一行。

我所期望的:

Received: 0

一次。

显然,我对请求-回复的理解完全错误。


(20 小时后)

我不知道为什么。但是背靠背 zmq_send() 解决了这个问题。以下(服务器)代码片段按预期工作:

int main (void) {
    //  Socket to talk to clients
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0);

    while (1) {
         char buffer [2];
         zmq_recv (responder, buffer, 2, 0);
         zmq_send (responder, "ACK", 3, 0);
         printf ("Received: %s\n",buffer);
    }
    return 0;
}

这是有道理的:REP 套接字接收和发送,REQ 套接字发送和接收。

在您的示例中,您应该尝试使用 PUSH 套接字发送和使用 PULL 套接字接收。