发现有童鞋不是很清楚ZMQ中的“请求-回复”模式中的ROUTER怎么用,所以简单介绍一下“请求-回复”模式的使用(最后付代码)。
一、讲一讲
1、要使用zmq 通过一个router进行通信,你首先需要知道ZMQ中的“请求-回复”模式,不清楚的话可以先看一下下面这篇文章,连接如下:
http://www.cnblogs.com/fengbohello/p/4354989.html
在“请求-回复”模式中,router是一个比较特殊的 socket类型,它会把它接收到的第一个消息作为消息来源的标志,也就是消息源的identity;而在使用ZMQ_ROUTER类型的socket发送消息的时候呢,会把这个socket发送的第一个消息作为目的地址,及消息的目的identity。示意图如下
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