1.下载编译安装zmq
1.1 安装必须的库
sudo apt-get install libtool
sudo apt-get install pkg-config
sudo apt-get install build-essential
sudo apt-get install autoconf
sudo apt-get install automake
1.2 安装加密库
Sodium一个易于使用的可为我们提供加密、解密、签名,密码哈希等功能的软件库。除了自身强大的功能外,它还为我们提供了一个兼容API和一个外部API,以进一步的帮助我们提高其可用性。Sodium的目标 是提供构建更高级别加密工具具所需的所有核心操作
git clone git://github.com/jedisct1/libsodium.git
cd libsodium
./autogen.sh -s
./configure && make check
sudo make install
sudo ldconfig
cd ..
1.3 下载、编译、安装libzmq
# 下载
git clone https://github.com/zeromq/libzmq.git
cd libzmq
# 查看tag
git tag
# 版本 获取指定的版本,不要⽤主分⽀,可能有bug
git checkout v4.3.2
./autogen.sh
./configure && make check
sudo make install
sudo ldconfig
cd ..
sudo make install的是时候可以看到具体的.so和.a
libtool: install: /usr/bin/install -c src/.libs/libzmq.lai /usr/local/lib/libzmq.la libtool: install: /usr/bin/install -c src/.libs/libzmq.a /usr/local/lib/libzmq.a libtool: install: chmod 644 /usr/local/lib/libzmq.a libtool: install: ranlib /usr/local/lib/libzmq.a libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig - n /usr/local/lib
我们在编译的时候需要加上libzmq库,比如gcc -o bin file.c -lzmq
2.测试
让我们从简单的代码开始,一段传统的Hello World程序。我们会创建一个客户端和一个服务端,客户端发 送Hello给服务端,服务端返回World。下面是C语言编写的服务端,它在5555端口打开一个ZMQ套接字, 等待请求,收到后应答World。
client.c
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
//编译:gcc -o hwclient hwclient.c -lzmq
int main (void)
{
printf ("Connecting to hello world server...\n");
void *context = zmq_ctx_new (); // 一个线程
// 连接至服务端的套接字
void *requester = zmq_socket (context, ZMQ_REQ); // 内部创建了2个线程,总共变成了3个线程
zmq_connect (requester, "tcp://localhost:5555"); // 连接并绑定 绑定对应的io线程
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
char buffer [10];
printf ("A 正在发送 Hello %d...\n", request_nbr);
zmq_send (requester, "Hello", 5, 0);
zmq_recv (requester, buffer, 5, 0); // 收到响应才能再发
//printf ("接收到 Hello World %d\n", request_nbr);
printf ("B 正在发送 xiaoluo %d...\n", request_nbr);
//zmq_send (requester, "Darren", 6, 0); // 无效
//zmq_send (requester, "king", 4, 0); // 无效
zmq_recv (requester, buffer, 6, 0); // 收到响应才能再发
printf ("接收到xiaoluo World %d\n", request_nbr);
}
zmq_close (requester);
zmq_ctx_destroy (context);
return 0;
}
server.c
//
// Hello World 服务端
// 绑定一个REP套接字至tcp://*:5555
// 从客户端接收Hello,并应答World
//
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
//gcc -o hwserver hwserver.c -lzmq
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 [10];
int size = zmq_recv (responder, buffer, 10, 0);
buffer[size] = '\0';
printf ("收到 %s\n", buffer);
sleep (1); // Do some 'work'
// 返回应答
zmq_send (responder, "World", 5, 0);
}
return 0;
}
client编译:gcc -o client client.c -lzmq
server编译:gcc -o server server.c -lzmq
注意:使用REQ-REP模式收发消息需要遵循一定的规律:客户端首先使用zmq_send发送消息,再使用zmq_recv接收消息,如果打乱了这个顺序,如连续接收或发送两次,则会报错。类似地。服务端必须先接收消息,后发送消息。
运行:启动顺序随意,先启动server或者client均可