发现有童鞋不是很清楚ZMQ中的“请求-回复”模式中的ROUTER怎么用,所以简单介绍一下“请求-回复”模式的使用(最后付代码)。

一、讲一讲

1、要使用zmq 通过一个router进行通信,你首先需要知道ZMQ中的“请求-回复”模式,不清楚的话可以先看一下下面这篇文章,连接如下:

http://www.cnblogs.com/fengbohello/p/4354989.html

在“请求-回复”模式中,router是一个比较特殊的 socket类型,它会把它接收到的第一个消息作为消息来源的标志,也就是消息源的identity;而在使用ZMQ_ROUTER类型的socket发送消息的时候呢,会把这个socket发送的第一个消息作为目的地址,及消息的目的identity。示意图如下

zeromq中两个dealer 通过一个router进行通信

1、identity 为 aaa 的 socket 发送了一个消息,这个消息由两部分组成,一个是目的 socket的identity,名字为bbb,另一个是真正的消息,就是"hello"。

2、当aaa 发送的消息被其连接的router接收到之后呢,就不仅仅是刚刚的消息了,ZMQ的底层会偷偷的增加一个消息,那就是 aaa 的identity,所以在 router 看来呢,它接收到的其实是三部分的消息,第一个是消息的来源,第二个是目的地址(bbb 的 identity),第三部分就是真正要传达的信息。

3、当router接收到这么一个消息的时候,会发现,这个消息来源于aaa,并且是发向bbb的,所以router就会发送如下消息:首先发送一个 bbb,表示要发给的目的地址的identity是bbb,然后发送aaa,最后是信息hello。

4、identity 为 bbb的dealer 接收到消息之后,就只有aaa和hello了。router发送的时候不是首先发送了一个bbb吗,去哪里了呢?这次被ZMQ偷偷的拿走了。这就是router的神奇之处,它会看到ZMQ_DEALER和ZMQ_REQ/ZMQ_REP不能看到的东西

现在再把“请求-回复”模式的规则说一下:就是,ZMQ_ROUTER能够看到消息的来源,以及消息的去向,并且ZMQ_ROUTER会把接收到的第一个消息作为消息来源的identity,把发送的第一个消息作为消息目的地址的identity。

二、下面是代码,代码由五个文件组成,还有一个makefile。

  我相信在你使用ZMQ的时候已经安装好了ZMQ的链接库,如果确实还没有安装好的话,按照下面这篇文章安装就可以了。http://www.cnblogs.com/fengbohello/p/4046686.html

  注:代码在CentOS下编译并运行通过,其它机器没有测试。

在本页复制或者到我的百度网盘进行下载:dlr2rtr2dlr.rar  http://pan.baidu.com/s/1pJIICpt

comm.h

//comm.h
#ifndef _ZMQCOMM_H_
#define _ZMQCOMM_H_
#include <zmq.h>

#define NAME_LEN    256
#define MSG_LEN        1024

typedef struct {
    char szSrc[NAME_LEN];
    char szDst[NAME_LEN];
    char szMsg[MSG_LEN];
}Zmqmsg;

typedef struct {
    void * sock;
    int iType;
}ZmqSock;

void lockSocket();
void unlockSocket();

int  s_recv(ZmqSock * sock, Zmqmsg * zMsg);
int  s_send(ZmqSock * sock, Zmqmsg * zMsg);

#endif
View Code

相关文章:

  • 2022-12-23
  • 2021-11-29
  • 2022-12-23
  • 2022-12-23
  • 2021-11-03
  • 2021-08-15
  • 2021-06-21
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2021-11-05
  • 2021-11-10
相关资源
相似解决方案