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);
我正在尝试使用 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);