2016-03-01 43 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套接字来接收。