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

首先在机器中安装zmq库

步骤如下:

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

百度网盘的下载地址 : http://pan.baidu.com/s/1mg61em0

ZMQ API 的 百度网盘 下载地址 : http://pan.baidu.com/s/1jGDqXfS

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

2)解压源文件

  1. tar zxf zeromq-4.0..tar.gz

3)

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

  1. cd zeromq-4.0.

3.2执行配置文件

  1. ./configure

3.3 进行编译

  1. make

3.4 安装zmq

  1. 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 ;
  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 ;
  22. }
  23. int iRcvTimeout = ;// millsecond
  24. //设置zmq的接收超时时间为5秒
  25. if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < )
  26. {
  27. zmq_close(pSock);
  28. zmq_ctx_destroy(pCtx);
  29. return ;
  30. }
  31. //绑定地址 tcp://*:7766
  32. //也就是使用tcp协议进行通信,使用网络端口 7766
  33. if(zmq_bind(pSock, pAddr) < )
  34. {
  35. zmq_close(pSock);
  36. zmq_ctx_destroy(pCtx);
  37. return ;
  38. }
  39. printf("bind at : %s\n", pAddr);
  40. while()
  41. {
  42. char szMsg[] = {};
  43. printf("waitting...\n");
  44. errno = ;
  45. //循环等待接收到来的消息,当超过5秒没有接到消息时,
  46. //zmq_recv函数返回错误信息 ,并使用zmq_strerror函数进行错误定位
  47. if(zmq_recv(pSock, szMsg, sizeof(szMsg), ) < )
  48. {
  49. printf("error = %s\n", zmq_strerror(errno));
  50. continue;
  51. }
  52. printf("received message : %s\n", szMsg);
  53. }
  54.  
  55. return ;
  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 ;
  17. }
  18. //创建socket
  19. if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
  20. {
  21. zmq_ctx_destroy(pCtx);
  22. return ;
  23. }
  24. int iSndTimeout = ;// millsecond
  25. //设置接收超时
  26. if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < )
  27. {
  28. zmq_close(pSock);
  29. zmq_ctx_destroy(pCtx);
  30. return ;
  31. }
  32. //连接目标IP192.168.1.2,端口7766
  33. if(zmq_connect(pSock, pAddr) < )
  34. {
  35. zmq_close(pSock);
  36. zmq_ctx_destroy(pCtx);
  37. return ;
  38. }
  39. //循环发送消息
  40. while()
  41. {
  42. static int i = ;
  43. char szMsg[] = {};
  44. snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++);
  45. printf("Enter to send...\n");
  46. if(zmq_send(pSock, szMsg, sizeof(szMsg), ) < )
  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 ;
  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. 1 $ ./recv
  2. bind at : tcp://*:7766
  3. waitting...
  4. received message : hello world :
  5. waitting...
  6. received message : hello world :
  7. waitting...
  8. received message : hello world :
  9. waitting...
  10. received message : hello world :
  11. waitting...
  12. received message : hello world :
  13. waitting...
  14. received message : hello world :
  15. waitting...

6.2 发送端

  1. $ ./send
  2. Enter to send...
  3. send message : [hello world : ] succeed
  4.  
  5. Enter to send...
  6. send message : [hello world : ] succeed
  7.  
  8. Enter to send...
  9. send message : [hello world : ] succeed
  10.  
  11. Enter to send...
  12. send message : [hello world : ] succeed
  13.  
  14. Enter to send...
  15. send message : [hello world : ] succeed
  16.  
  17. Enter to send...
  18. send message : [hello world : ] 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

ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信的更多相关文章

  1. ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信

    1.本文包括 1)在windows下使用ZMQ 2)在windows环境下与Linux环境下进行网络通信 2.在Linux下使用ZMQ 之前写过一篇如何在Linux环境下使用ZMQ的文章 <Ze ...

  2. 实现upnp ssdp来查找局域网内的其他节点

    upnp协议常用于一些智能家居产品中,这些产品连上家里局域网后,用同样连入家中局域网的手机就能很快检测到此产品了.在区块链技术中,upnp也被应用于寻找同一局域网内的其他节点. 关于upnp的具体描述 ...

  3. ICMP协议 广播以查询局域网内的所有主机

    看到了很多局域网内的主机扫描工具,在想怎么去实现这样一个工具.前几天看了Ping源码--ICMP协议的实例,ICMP可以用来探测网联网内的任一主机,ICMP和广播地址结合来扫描局域网内的所有主机不是很 ...

  4. 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)

    安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...

  5. Snmp协议应用-扫描局域网内打印机

    .h2cls { background: #6fa833 none repeat scroll 0 0 !important; color: #fff; font-family: "微软雅黑 ...

  6. Windows下查看局域网内某台计算机的MAC地址

    我们知道在局域网中,在Windows下,查看局域网内其他主机的ip和对应mac地址的命令是: arp -a 这样可以看到ip和mac地址的对应关系,还是比较方便的 但是有些时候使用arp命令并不能列出 ...

  7. 查询局域网内在线电脑IP

    COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off&setlocal enabledelayedexpansion ECHO 正 ...

  8. 怎么在手机浏览器上访问电脑本地的文件,局域网内,自建WiFi也可以

    首先,电脑要有Mysql+Apache+PHP环境,我直接用Wampsever,开启环境后手机和电脑要再同一个局域网内,然后电脑上打开win+R,输入cmd,再输入ipconfig,就可以看着这台的电 ...

  9. 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机

    很多的朋友都想把自己的电脑打造为服务器使别人能够访问.比如说你自己写了一网站,只能自己通过localhost访问或127.0.0.1访问.但是怎么让别人的电脑也能访问呢?来看看自己写的网站.现在我来讲 ...

随机推荐

  1. 循环中的continue功能

    在oracle存储过程中,有时我们希望在循环中为某种情况时不做任何处理,类似于c语言中的continue,跳过本次循环:在oracle 11g中好像增加了这个关键字,在之前版本中我们可以通过如下方式来 ...

  2. MySQL索引的设计和使用

    一.索引可以有效地提升SELECT操作的性能,同时会影响UPDATE.CREATE和DELETE操作的性能.每种引擎对于表的索引有数量和长度的限制. 二.索引的设计原则 (A) 搜索的索引列,不一定是 ...

  3. Hydra用户手册

    Hydra 参数: -R继续从上一次进度接着破解 -S大写,采用SSL链接 -s <PORT>小写,可通过这个参数指定非默认端口 -l <LOGIN>指定破解的用户,对特定用户 ...

  4. 提取刷机包内system.new.dat文件

    转换 使用python脚本sdat2img来完成 sdat2img.py system.transfer.list system.new.dat system.img 输出信息 Skipping co ...

  5. start WampServer如何关闭浏览目录

    打开Httpd.conf IncludesNOEXEC Indexes 去掉这个代码就可以了

  6. Spring @AspectJ 实现AOP 入门例子(转)

    AOP的作用这里就不再作说明了,下面开始讲解一个很简单的入门级例子. 引用一个猴子偷桃,守护者守护果园抓住猴子的小情节. 1.猴子偷桃类(普通类): package com.samter.common ...

  7. 【krpano】高德地图导航插件(源码+介绍+预览)

    简介 krpano可以利用js调用第三方网页版地图,因此可以实现导航效果,用来帮助用户导航到我们全景所在的位置. 效果截图如下,在手机端点击左侧按钮,便会对用户进行定位,跳转至高德地图进行导航     ...

  8. nginx配置文件或目录404和403

    对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...

  9. MAC 远程桌面链接 证书或链接无效

    RDC --> 首选项  -->  安全性 --> 勾选即使验证失败也要链接.   问题解决.

  10. iOS开发 iOS10推送必看(基础篇)

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助.   原文链接   一.简单入门篇---看完就可以简单适配完了相对简单的推送证书以及环境的 ...