本文内容摘要: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)解压源文件

tar zxf zeromq-4.0..tar.gz

3)

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

cd zeromq-4.0.

3.2执行配置文件

./configure

3.3 进行编译

make

3.4 安装zmq

make install

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

4.1接收端代码

 //包含zmq的头文件
#include <zmq.h>
#include "stdio.h" int main(int argc, char * argv[])
{
void * pCtx = NULL;
void * pSock = NULL;
const char * pAddr = "tcp://*:7766"; //创建context,zmq的socket 需要在context上进行创建
if((pCtx = zmq_ctx_new()) == NULL)
{
return ;
}
//创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式
//具体使用方式请参考zmq官方文档(zmq手册)
if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
{
zmq_ctx_destroy(pCtx);
return ;
}
int iRcvTimeout = ;// millsecond
//设置zmq的接收超时时间为5秒
if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < )
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
//绑定地址 tcp://*:7766
//也就是使用tcp协议进行通信,使用网络端口 7766
if(zmq_bind(pSock, pAddr) < )
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
printf("bind at : %s\n", pAddr);
while()
{
char szMsg[] = {};
printf("waitting...\n");
errno = ;
//循环等待接收到来的消息,当超过5秒没有接到消息时,
//zmq_recv函数返回错误信息 ,并使用zmq_strerror函数进行错误定位
if(zmq_recv(pSock, szMsg, sizeof(szMsg), ) < )
{
printf("error = %s\n", zmq_strerror(errno));
continue;
}
printf("received message : %s\n", szMsg);
} return ;
}

4.2发送端代码

 //包含zmq的头文件
#include <zmq.h>
#include "stdio.h" int main(int argc, char * argv[])
{
void * pCtx = NULL;
void * pSock = NULL;
//使用tcp协议进行通信,需要连接的目标机器IP地址为192.168.1.2
//通信使用的网络端口 为7766
const char * pAddr = "tcp://192.168.1.2:7766"; //创建context
if((pCtx = zmq_ctx_new()) == NULL)
{
return ;
}
//创建socket
if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
{
zmq_ctx_destroy(pCtx);
return ;
}
int iSndTimeout = ;// millsecond
//设置接收超时
if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < )
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
//连接目标IP192.168.1.2,端口7766
if(zmq_connect(pSock, pAddr) < )
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return ;
}
//循环发送消息
while()
{
static int i = ;
char szMsg[] = {};
snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++);
printf("Enter to send...\n");
if(zmq_send(pSock, szMsg, sizeof(szMsg), ) < )
{
fprintf(stderr, "send message faild\n");
continue;
}
printf("send message : [%s] succeed\n", szMsg);
getchar();
} return ;
}

5)在CentOS下编译通过,记得要加zmq的链接库 -lzmq

 gcc -o recv recv.c -lzmq
gcc -o send send.c -lzmq

6)在机器192.168.1.2上运行recv程序,在同一个局域网的另一台机器(同一台机器也可以)上运行send程序,结果如下

6.1接收端

 1 $ ./recv
bind at : tcp://*:7766
waitting...
received message : hello world :
waitting...
received message : hello world :
waitting...
received message : hello world :
waitting...
received message : hello world :
waitting...
received message : hello world :
waitting...
received message : hello world :
waitting...

6.2 发送端

 $ ./send
Enter to send...
send message : [hello world : ] succeed Enter to send...
send message : [hello world : ] succeed Enter to send...
send message : [hello world : ] succeed Enter to send...
send message : [hello world : ] succeed Enter to send...
send message : [hello world : ] succeed Enter to send...
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. 浅谈Android下的Bitmap之大Bitmap加载

    引言 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用 ...

  2. Shell case esac语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  3. Go - 变量初始化 及 注意事项

    Go变量 初始化 对 复合类型(数组.切片.字典.结构体)变量的初始化是,有一些语法限制: 1.初始化表达式必须包含类型标签: 2.左花括号必须在类型尾部,不能另起一行: 3.多个成员初始值以逗号分隔 ...

  4. java基础知识(一)数据类型(下)

    前面介绍了java的8种基本数据类型,包括boolean, byte, char, short,  int, long, float, double.同时,java也提供了这些类型的封装类,分别为Bo ...

  5. 1.1ASP.NET Web API 2入门

    HTTP 不只是为了生成 web 页面.它也是建立公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以达到范围 ...

  6. 页面localStorage用作数据缓存的简易封装

    最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但localStorage过于简单,没有任何管理和限 ...

  7. C++基础知识(4)---例外、异常处理

    对Java熟悉的朋友们都很清楚,java中的异常处理机制是非常完善的.并且java强制使用异常处理,用户必须对有可能出现异常的情况进行处理. 在C++中并没有强制用户使用异常处理,但是使用异常处理将会 ...

  8. @echo off 与echo off

    echo off 关闭其他命令的显示(但是不包括自身这条命令) @echo off 关闭所有命令的显示(@关闭其后命令的显示)

  9. 1.从Node.js链接到MongoDB

    MongoDB采用了MongoDB Node.js驱动程序作为标准. 1.安装MongoDB驱动 npm install mongoDB npm install mongoose require('m ...

  10. rabbitmq 的心跳机制&应用

    官方文档说: If a consumer dies (its channel is closed, connection is closed, or TCP connection is lost) w ...