博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信
阅读量:5147 次
发布时间:2019-06-13

本文共 4364 字,大约阅读时间需要 14 分钟。

本文内容摘要:1)安装zeromq、2)实例说明使用zmq进行网络间的消息发送和接收

首先在机器中安装zmq库

步骤如下:

1)下载zeromq的源代码,ZeroMQ的官方网址:    

    百度网盘的下载地址 :  

    ZMQ API 的 百度网盘 下载地址 : 

    :在本文写作时,ZMQ版本已经升级到4.1.0,不过影响没多大

2)解压源文件

tar zxf zeromq-4.0.3.tar.gz

3)

 3.1进入zmq目录并进行编译和安装

cd zeromq-4.0.3

 3.2执行配置文件

./configure

 3.3 进行编译

make

 3.4 安装zmq

make install

4)现在开始使用zmq进行网络通信

 4.1接收端代码

1 //包含zmq的头文件  2 #include 
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;// millsecond24 //设置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协议进行通信,使用网络端口 776633 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 
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.210 //通信使用的网络端口 为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;// millsecond25 //设置接收超时 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 -lzmq2 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 :   311 waitting...12 received message : hello world :   413 waitting...14 received message : hello world :   515 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] succeed10 11 Enter to send...12 send message : [hello world :   3] succeed13 14 Enter to send...15 send message : [hello world :   4] succeed16 17 Enter to send...18 send message : [hello world :   5] succeed

7)结束语

以上是zmq最基本的网络通讯实例,在此基础上可以进行更复杂的设计,写出一些网络聊天、文件传输等的网络软件。

如何在Windows上使用ZeroMQ请看这里:

 

更多 ZeroMQ API :

 

作者:风波

mail : fengbohello@qq.com

 

转载于:https://www.cnblogs.com/fengbohello/p/4046686.html

你可能感兴趣的文章
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
Hdu - 1002 - A + B Problem II
查看>>
每天CookBook之Python-003
查看>>
Android设置Gmail邮箱
查看>>
js编写时间选择框
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>