ZeroMQ 不能发送两次然后接收两次,中间什么也没有

ZeroMQ can't send twice and then receive twice with nothing in between

我正在尝试使用 ZeroMQ 编写 client/server 应用程序。我编写了一个服务器,它通过 zmq_send() 一个接一个地发送两条消息,以响应来自客户端的 GET_DATA 消息。

客户端发送 GET_DATA 然后尝试调用 zmq_recv() 两次以获取服务器发送的两条消息。不幸的是,第二次调用 zmq_recv() 在客户端失败,带有 -1 return 而没有 errno.

为了响应 GET_DATA,服务器只需调用:

zmq_send (responder, "**start**", 9, 0); 
zmq_send (responder, "**done**", 8, 0);

客户端代码如下:

#include "stdafx.h" 

#include "zmq.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    printf ("Connecting to server.\n"); 
    void *context = zmq_ctx_new (); 
    void *requester = zmq_socket (context, ZMQ_REQ); 
    zmq_connect (requester, "tcp://localhost:5555"); 

    char szCommand[] = "GET_DATA"; 
    zmq_send(requester, szCommand, sizeof(szCommand), 0); 

    char buffer[512]; 
    int nLen = zmq_recv(requester, buffer, sizeof(buffer) - 1, 0); 
    if( nLen >= 0 ) printf("%*.*s\n", nLen, nLen, buffer); 
    nLen = zmq_recv(requester, buffer, sizeof(buffer) - 1, 0); 
    if( nLen < 0 ) printf("errno = %s\n", strerror(errno)); 
    printf("done\n"); 

    zmq_close (requester); 
    zmq_ctx_destroy (context); 
    fgetc(stdin); 
    return 0; 
}

客户端的输出为:

Connecting to Server.
**start**
errno = No Error
done

有人可以解释为什么在客户端中第二次调用 zmq_recv() returns -1 吗?

注意:在以前的版本中,我得到的 errno 为 9(这似乎是错误的文件或其他东西)。

为后代编辑: 这是在 Win32 上写的,应该使用 zmq_errno() 而不是直接访问 errno 但我后来才知道,所以这个问题确实在这里引起了一些噪音。

zeromq 中的 Req-rep 套接字类型遵循状态机,因此您可以请求而不是必须接收,在您的情况下您会收到两次,这是不受支持的。但是,您可以在服务器端使用多部分消息,在标志参数中使用 ZMQ_SNDMORE 的第一个发送调用中。

像这样:

zmq_send(response, "Part1", 5, ZMQ_SNDMORE);
zmq_send(response, "Part2", 5, 0);