ZMQ安装和使用
ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的 API 接口
跟 Socket 的区别是:普通的 socket 是端到端的(1:1的关系),而 ZMQ 却是可以N:M 的关系,人们对 BSD 套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而 ZMQ 屏蔽了这些细节,让你的网络编程更为简单。ZMQ 用于 node 与 node 间的通信,node 可以是主机或者是进程。
ZMQ 提供了三个基本的通信模型,分别是“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”,具体内容参见http://news.cnblogs.com/n/154000/
区别:
1、zmq套接字是异步的,可以实现特定模式
2、TCP是一对一,ZeroMQ是多对多的,可以根据套接字类型实现一对多,一对一,多对一,或多对多
3、ZeroMQ传输消息,TCP传输字节
4、ZeroMQ 隐藏IO细节,ZeroMQ不在乎目的是否存在
5、ZeroMQ可以往多个节点发送数据,可以从多个节点接收数据
一、安装
在ubuntu上安装并测试成功,过程见下:
(1)下载最新的ZeroMQ:http://download.zeromq.org/
(2)解压:tar -xvf zeromq-4.1.2.tar.gz
(3)编译
./configure 提示
checking for sodium... no
configure: error: Package requirements (libsodium) were not met
解决办法,暂时先屏蔽掉这个库:
./configure --prefix=/home/libdev/zmq --without-libsodium //红色部分路径可以去掉
make
make install
安装成功。
二、测试程序
server端:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <zmq.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 == ); while () {
char buffer [];
zmq_recv (responder, buffer, , );
printf ("Received Hello\n");
sleep (); // Do some 'work'
zmq_send (responder, "World", , );
}
return ;
}
client端:
// Hello World client
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h> int main (void)
{
printf ("Connecting to hello world server…\n"); /*创建一个新的上下文*/
void *context = zmq_ctx_new ();
void *requester = zmq_socket (context, ZMQ_REQ);
/*通过tcp协议,5555端口,连接本机服务端*/
zmq_connect (requester, "tcp://localhost:5555"); int request_nbr;
for (request_nbr = ; request_nbr != ; request_nbr++) {
char buffer [];
printf ("Sending Hello %d…\n", request_nbr);
zmq_send (requester, "Hello", , );
zmq_recv (requester, buffer, , );
printf ("Received World %d\n", request_nbr);
} zmq_close (requester);
zmq_ctx_destroy (context); return ;
}
编译:注意加上动态库
gcc hwserver_.c -o hwserver -lzmq
gcc hwclient_.c -o hwclient -lzmp
运行:出现如下错误
[root@localhost hwserver]# ./hwserver
./hwserver: error while loading shared libraries: libzmq.so.: cannot open shared object file: No such file or directory
解决办法:加上zmq.so的路径:
sudo find ./ -depth -name "libzmq.so" -print //找出动态库路径 cd /etc
sudo vim ld.so.conf //
include /usr/local/lib //把zmq.so的路径加进来
ldconfig //记住执行这句话
然后启动hwserver和hwclient,执行结果如下所示:
参考:http://www.cnblogs.com/Anker/p/4706244.html