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 套接字接收。
考虑以下请求-回复设置的最小示例:
服务器:
// 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 套接字接收。