文档章节

使用 acl 异步库及ICMP协议库编写了一个同时PING多个目标IP的程序

郑树新
 郑树新
发布于 2014/09/03 12:10
字数 1110
阅读 25
收藏 0

      在 acl 的软件包中,lib_acl 是一个基础的库,另外,还有另外一个库 lib_protocol,这个库中不仅包含了 HTTP 协议的实现,而且还有一个 ICMP PING 协议的实现。前些日子,看到开源中国的微博中提到 fping 的新版本发布了,这是一个可以在一个线程里同时 PING 多个 IP 的程序,心中不尽暗痒,想到自己曾经还专门实现了一个类似的库,并且通用性可能更强,何不写出来给大家分享一下?因此,本篇主要是先以一个简单的小例子入手,演示如何使用 acl 中的这个 ICMP 协议包实现一个可以同时支持 WIN32 和 LINUX 的多目标 PING 程序。

   部分 API 接口说明:

/**
 * 创建ICMP会话对象
 * @param aio {ACL_AIO*} 如果该项不为空,则内部在通信过程中采用非阻塞模式,
 *  否则采用阻塞模式
 * @param check_tid {int} 是否在校验响应包时检查数据中的线程号字段
 * @return {ICMP_CHAT*} ICMP会话对象句柄
 */
ICMP_API ICMP_CHAT *icmp_chat_create(ACL_AIO *aio, int check_tid);

/**
 * 释放ICMP会话对象
 * @param chat {ICMP_CHAT*} ICMP会话对象句柄
 */
ICMP_API void icmp_chat_free(ICMP_CHAT *chat);

/**
 * 判断当前的ICMP会话对象中所有探测任务是否已经完成
 * @param chat {ICMP_CHAT*} 会话对象句柄
 * @return {int} != 0: 表示完成; 0: 表示未完成
 */
ICMP_API int icmp_chat_finish(ICMP_CHAT *chat);

/**
 * ping 一台主机(内部默认每个探测包长度为64个字节)
 * @param chat {ICMP_CHAT*} 会话对象句柄
 * @param domain {const char*} 域名标识字符串,可以为空
 * @param ip {const char*} 主机IP地址,不能为空
 * @param npkt {size_t} 对该主机发送的数据包个数
 * @param delay {int} 发送探测数据包的时间间隔(秒)
 * @param timeout {int} 被探测主机的响应包超时时间(秒)
 */
ICMP_API void icmp_ping_one(ICMP_CHAT *chat, const char *domain,
	const char *ip, size_t npkt, int delay, int timeout);

/**
 * 输出当前ICMP的会话状态
 * @param chat {ICMP_CHAT*} 会话对象句柄
 */
ICMP_API void icmp_stat(ICMP_CHAT *chat);

/**
 * 取得当前ICMP会话对象中的当前会话序列号值
 * @param chat {ICMP_CHAT*} 会话对象句柄
 * @return {unsigned short} 会话序列号值
 */
ICMP_API unsigned short icmp_chat_seqno(ICMP_CHAT *chat);

 

      下面一个简单的小例子:

 

 

#include "lib_acl.h"
#include "lib_protocol.h"

static void ping_main_async(void)
{
	int   delay = 1;  /* 发送 PING 数据包的时间间隔(秒) */
	int   npkt = 10;  /* 发送的 PING 数据包个数 */
	ACL_AIO *aio;
	ICMP_CHAT *icmp;

	/* 创建非阻塞异步通信句柄 */
	aio = acl_aio_create(ACL_EVENT_SELECT);
	acl_aio_set_keep_read(aio, 0);

	/* 创建 ICMP 对象 */
	icmp = icmp_chat_create(aio, 1);

	/* PING www.baidu.com 的一个 IP 地址*/
	icmp_ping_one(icmp, NULL, 61.135.169.115, npkt, delay, 1);
	/* PING www.sina.com.cn 的一个 IP 地址 */
	icmp_ping_one(icmp, NULL, 202.108.33.60, npkt, delay, 1);
	/* PING www.hexun.com 的一个 IP 地址 */
	icmp_ping_one(icmp, NULL, 202.99.16.169, npkt, delay, 1);
	/* PING www.qq.com 的一个 IP 地址 */
	icmp_ping_one(icmp, NULL, 61.135.167.36, npkt, delay, 1);

	while (1) {
		/* 如果 PING 结束,则退出循环 */
		if (icmp_chat_finish(icmp)) {
			printf("over now!, hosts' size=%d, count=%d\r\n",
				icmp_chat_size(icmp), icmp_chat_count(icmp));
			break;
		}

		/* 异步事件循环过程 */
		acl_aio_loop(aio);
	}

	/* 显示 PING 结果 */
	icmp_stat(icmp);;
	/* 释放 ICMP 对象 */
	icmp_chat_free(icmp);

	/* 销毁非阻塞句柄 */
	acl_aio_free(aio);
}

 

      可以看出,该例子还是非常简单的,在 acl/samples/ping 下有该例子的完整实现,编译后,运行下面命令:

      ./ping -n 10 www.baidu.com www.sina.com.cn www.hexun.com www.qq.com

      得到如下的输出结果

 

Reply from 202.108.33.60: bytes=56 time=5.427ms TTL=202 icmp_seq=2 status=0
Reply from 61.135.169.105: bytes=64 time=5.975ms TTL=61 icmp_seq=1 status=0
Reply from 61.135.169.125: bytes=64 time=6.394ms TTL=61 icmp_seq=0 status=0
Reply from 61.135.167.36: bytes=64 time=8.147ms TTL=61 icmp_seq=4 status=0
Reply from 202.99.16.169: bytes=64 time=8.532ms TTL=202 icmp_seq=3 status=0
Reply from 61.135.169.105: bytes=64 time=4.879ms TTL=61 icmp_seq=6 status=0
Reply from 202.108.33.60: bytes=56 time=5.313ms TTL=202 icmp_seq=5 status=0
Reply from 61.135.169.125: bytes=64 time=6.695ms TTL=61 icmp_seq=7 status=0
Reply from 61.135.167.36: bytes=64 time=5.963ms TTL=61 icmp_seq=8 status=0

。。。

Ping statistics for 61.135.169.125: www.baidu.com
        Packets: Sent = 10, Received = 10, Lost = 0 (0.00% loss),
Approximate round trip times in milli-seconds:
        Minimum = 5.187 ms, Maximum = 7.143 ms, Average = 6.307 ms
Ping statistics for 61.135.169.105: www.baidu.com
        Packets: Sent = 10, Received = 10, Lost = 0 (0.00% loss),
Approximate round trip times in milli-seconds:
        Minimum = 4.123 ms, Maximum = 8.807 ms, Average = 5.556 ms
Ping statistics for 202.108.33.60: www.sina.com.cn
        Packets: Sent = 10, Received = 10, Lost = 0 (0.00% loss),
Approximate round trip times in milli-seconds:
        Minimum = 4.319 ms, Maximum = 8.073 ms, Average = 5.855 ms
Ping statistics for 202.99.16.169: www.hexun.com
        Packets: Sent = 10, Received = 10, Lost = 0 (0.00% loss),
Approximate round trip times in milli-seconds:
        Minimum = 5.376 ms, Maximum = 8.532 ms, Average = 6.453 ms
Ping statistics for 61.135.167.36: www.qq.com
        Packets: Sent = 10, Received = 10, Lost = 0 (0.00% loss),
Approximate round trip times in milli-seconds:
        Minimum = 4.292 ms, Maximum = 8.147 ms, Average = 5.948 ms
>>>max pkts: 50

 

    个人微博:http://weibo.com/zsxxsz

    acl 库的下载地址:http://http://sourceforge.net/projects/acl/?source=directory

© 著作权归作者所有

郑树新

郑树新

粉丝 104
博文 87
码字总数 161171
作品 2
昌平
程序员
私信 提问
使用 Python 的 Socket 模块构建一个 UDP 扫描工具

当涉及到对一些目标网络的侦察时,出发点无疑是首先发现宿主主机。这个任务还可能包含嗅探和解析网络中数据包的能力。 几周前,我曾经谈到了如何使用Wireshark来进行数据包嗅探,但如果你没有...

oschina
2015/06/22
9.3K
9
跨平台网络通信与服务器编程框架库(acl库)介绍

一、描述 acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能 库。通过该库,用户可以非常容易地编写支持多种模式(...

郑树新
2014/08/23
0
0
跨平台网络通信与服务器编程框架库(acl库)介绍

一、描述 acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能 库。通过该库,用户可以非常容易地编写支持多种模式(...

郑树新
2014/08/18
7
0
第十二天内容《基础交换十二》

RIP : 属于距离矢量路由协议; 位于 OSI 模型的第 7 层,通过 UDP 520来表示; 传递路由的方式,是一跳一跳的传输;(hop - 跳) 版本: 默认版本: 发版本1,收版本1和2; 版本1:发版本1,收...

云计算王森
2017/11/18
0
0
ACL控制流量

ACL: access control list 访问控制列表,用于匹配感兴趣的流量,并进行“控制”。 作用:用于实现对数据报文的控制。 类型: 标准(standard):只能匹配IP头部中的源IP地址。 扩展(exten...

夜流璃雨
2017/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我为什么要写微信公众号

埋一颗种子,细心呵护,静待她枝繁叶茂,葱郁参天 V2论坛上有个帖子【做程序员最重要的还是一定要有自己的作品】,作者写道: 能有一个作品和你的名字联系在一起,应当成为在职业生涯前期着意...

运维咖啡吧
16分钟前
0
0
数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
6
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部