天天看點

ZeroMQ的編譯安裝和使用執行個體

一、編譯安裝

1.1 資料網址

ZeroMQ官方文檔網址:http://zguide.zeromq.org/page:all

源碼下載下傳位址:http://download.zeromq.org/

1.2 安裝必須的庫

$ 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.3 安裝加密庫

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.4 下載下傳、編譯、安裝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

二、使用執行個體

執行個體功能說明:一個用戶端一個服務端,用戶端發送Hello給服務端,服務端傳回World。

ZeroMQ的編譯安裝和使用執行個體

2.1 服務端源碼 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];
		 zmq_recv (responder, buffer, 10, 0);
		 printf ("收到 Hello\n");
		 sleep (1); // Do some 'work'
		 
		 // 傳回應答
		 zmq_send (responder, "World", 5, 0);
	 }
	 return 0;
 }
           

2.2 用戶端源碼 client.c

// 連接配接REQ套接字⾄ tcp://localhost:5555
 // 發送Hello給服務端,并接收World
//
// Hello World client
#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);
	zmq_connect (requester, "tcp://localhost:5555");
	
	 int request_nbr;
	 for (request_nbr = 0; request_nbr != 10; request_nbr++) 
	 {
		 char buffer [10];
		 printf ("正在發送 Hello %d...\n", request_nbr);
		 zmq_send (requester, "Hello", 5, 0);
		 zmq_recv (requester, buffer, 10, 0);
		 printf ("接收到 World %d\n", request_nbr);
	}
	 zmq_close (requester);
	 zmq_ctx_destroy (context);
	 return 0;
 }
           

編譯:

gcc -o server server.c -lzmq
gcc -o clientclient.c -lzmq
           

使用REQ-REP套接字發送和接受消息是需要遵循一定規律的。用戶端首先使用zmq_send()發送消息,再用zmq_recv()接收,如此循環。如果打亂了這個順序(如連續發送兩次)則會報錯。類似地,服務端必須先進行接收,後進行發送。

先運作服務端,再運作用戶端。

運作結果:

//服務端
$ ./server
 收到 Hello
 收到 Hello
 收到 Hello
 收到 Hello
 收到 Hello
 收到 Hello
           
//用戶端
$ ./client
 正在發送 Hello 0...
 接收到 World 0
 正在發送 Hello 1...
 接收到 World 1
 正在發送 Hello 2...
 接收到 World 2
 正在發送 Hello 3...
 接收到 World 3