本文內容摘要:1)安裝zeromq、2)實例說明使用zmq進行網絡間的消息發送和接收html
首先在機器中安裝zmq庫網絡
步驟以下:socket
1)下載zeromq的源代碼,ZeroMQ的官方網址:http://zeromq.org/ tcp
百度網盤的下載地址 : http://pan.baidu.com/s/1mg61em0 函數
ZMQ API 的 百度網盤 下載地址 : http://pan.baidu.com/s/1jGDqXfSspa
注:在本文寫做時,ZMQ版本已經升級到4.1.0,不過影響沒多大設計
2)解壓源文件3d
tar zxf zeromq-4.0.3.tar.gz
3)code
3.1進入zmq目錄並進行編譯和安裝htm
cd zeromq-4.0.3
3.2執行配置文件
./configure
3.3 進行編譯
make
3.4 安裝zmq
make install
4)如今開始使用zmq進行網絡通訊
4.1接收端代碼
1 //包含zmq的頭文件 2 #include <zmq.h> 3 #include "stdio.h" 4 5 int main(int argc, char * argv[]) 6 { 7 void * pCtx = NULL; 8 void * pSock = NULL; 9 const char * pAddr = "tcp://*:7766"; 10 11 //建立context,zmq的socket 須要在context上進行建立 12 if((pCtx = zmq_ctx_new()) == NULL) 13 { 14 return 0; 15 } 16 //建立zmq socket ,socket目前有6中屬性 ,這裏使用dealer方式 17 //具體使用方式請參考zmq官方文檔(zmq手冊) 18 if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL) 19 { 20 zmq_ctx_destroy(pCtx); 21 return 0; 22 } 23 int iRcvTimeout = 5000;// millsecond 24 //設置zmq的接收超時時間爲5秒 25 if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0) 26 { 27 zmq_close(pSock); 28 zmq_ctx_destroy(pCtx); 29 return 0; 30 } 31 //綁定地址 tcp://*:7766 32 //也就是使用tcp協議進行通訊,使用網絡端口 7766 33 if(zmq_bind(pSock, pAddr) < 0) 34 { 35 zmq_close(pSock); 36 zmq_ctx_destroy(pCtx); 37 return 0; 38 } 39 printf("bind at : %s\n", pAddr); 40 while(1) 41 { 42 char szMsg[1024] = {0}; 43 printf("waitting...\n"); 44 errno = 0; 45 //循環等待接收到來的消息,當超過5秒沒有接到消息時, 46 //zmq_recv函數返回錯誤信息 ,並使用zmq_strerror函數進行錯誤定位 47 if(zmq_recv(pSock, szMsg, sizeof(szMsg), 0) < 0) 48 { 49 printf("error = %s\n", zmq_strerror(errno)); 50 continue; 51 } 52 printf("received message : %s\n", szMsg); 53 } 54 55 return 0; 56 }
4.2發送端代碼
1 //包含zmq的頭文件 2 #include <zmq.h> 3 #include "stdio.h" 4 5 int main(int argc, char * argv[]) 6 { 7 void * pCtx = NULL; 8 void * pSock = NULL; 9 //使用tcp協議進行通訊,須要鏈接的目標機器IP地址爲192.168.1.2 10 //通訊使用的網絡端口 爲7766 11 const char * pAddr = "tcp://192.168.1.2:7766"; 12 13 //建立context 14 if((pCtx = zmq_ctx_new()) == NULL) 15 { 16 return 0; 17 } 18 //建立socket 19 if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL) 20 { 21 zmq_ctx_destroy(pCtx); 22 return 0; 23 } 24 int iSndTimeout = 5000;// millsecond 25 //設置接收超時 26 if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < 0) 27 { 28 zmq_close(pSock); 29 zmq_ctx_destroy(pCtx); 30 return 0; 31 } 32 //鏈接目標IP192.168.1.2,端口7766 33 if(zmq_connect(pSock, pAddr) < 0) 34 { 35 zmq_close(pSock); 36 zmq_ctx_destroy(pCtx); 37 return 0; 38 } 39 //循環發送消息 40 while(1) 41 { 42 static int i = 0; 43 char szMsg[1024] = {0}; 44 snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++); 45 printf("Enter to send...\n"); 46 if(zmq_send(pSock, szMsg, sizeof(szMsg), 0) < 0) 47 { 48 fprintf(stderr, "send message faild\n"); 49 continue; 50 } 51 printf("send message : [%s] succeed\n", szMsg); 52 getchar(); 53 } 54 55 return 0; 56 }
5)在CentOS下編譯經過,記得要加zmq的連接庫 -lzmq
1 gcc -o recv recv.c -lzmq 2 gcc -o send send.c -lzmq
6)在機器192.168.1.2上運行recv程序,在同一個局域網的另外一臺機器(同一臺機器也能夠)上運行send程序,結果以下
6.1接收端
1 $ ./recv 2 bind at : tcp://*:7766 3 waitting... 4 received message : hello world : 0 5 waitting... 6 received message : hello world : 1 7 waitting... 8 received message : hello world : 2 9 waitting... 10 received message : hello world : 3 11 waitting... 12 received message : hello world : 4 13 waitting... 14 received message : hello world : 5 15 waitting...
6.2 發送端
1 $ ./send 2 Enter to send... 3 send message : [hello world : 0] succeed 4 5 Enter to send... 6 send message : [hello world : 1] succeed 7 8 Enter to send... 9 send message : [hello world : 2] succeed 10 11 Enter to send... 12 send message : [hello world : 3] succeed 13 14 Enter to send... 15 send message : [hello world : 4] succeed 16 17 Enter to send... 18 send message : [hello world : 5] succeed
7)結束語
以上是zmq最基本的網絡通信實例,在此基礎上能夠進行更復雜的設計,寫出一些網絡聊天、文件傳輸等的網絡軟件。
如何在Windows上使用ZeroMQ請看這裏:http://www.cnblogs.com/fengbohello/p/4369082.html
更多 ZeroMQ API :http://www.cnblogs.com/fengbohello/p/4230135.html
做者:風波
mail : fengbohello@qq.com