1
考虑的请求 - 回复设置的以下最低例如:ZeroMQ(C):基本请求 - 回复问题
SERVER:
// 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;
}
CLIENT:
// 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;
}
是的,东西似乎在那里。 'zmq_recv()'是阻塞的,所以它的行为就好像它一遍又一遍地接收相同的消息 - 并且它在试图在一行中接收两次而不发送中间时会引发错误。你有独立的主机可以用来将客户机和服务器分离到不同的机器上吗?我的第一个猜测是,在ZMQ安装中出现了一些问题,所以我会尝试从另一台主机的两个方向,看看是否有预期的工作。 – Jason
谢谢@Jason,那肯定会是下一步.. –
而不是在缓冲区中接收它,尝试在zmq消息(使用zmsg_t)中接收它。请参阅[zmq_recv](http://api.zeromq.org/2-1:zmq-recv)。重复的zmq_recv调用意味着您没有读取要从套接字读取的所有内容。 – CatchMeIfYouTry