2016-03-01 84 views
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; 
} 
+1

是的,東西似乎在那裏。 'zmq_recv()'是阻塞的,所以它的行爲就好像它一遍又一遍地接收相同的消息 - 並且它在試圖在一行中接收兩次而不發送中間時會引發錯誤。你有獨立的主機可以用來將客戶機和服務器分離到不同的機器上嗎?我的第一個猜測是,在ZMQ安裝中出現了一些問題,所以我會嘗試從另一臺主機的兩個方向,看看是否有預期的工作。 – Jason

+0

謝謝@Jason,那肯定會是下一步.. –

+0

而不是在緩衝區中接收它,嘗試在zmq消息(使用zmsg_t)中接收它。請參閱[zmq_recv](http://api.zeromq.org/2-1:zmq-recv)。重複的zmq_recv調用意味着您沒有讀取要從套接字讀取的所有內容。 – CatchMeIfYouTry

回答

1

這是有道理的:一個REP套接字接收和發送,和REQ套接字發送和接收。

在你的例子中,你應該嘗試一個PUSH套接字發送和一個PULL套接字來接收。