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