`
zsxxsz
  • 浏览: 451102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

      在 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

1
12
分享到:
评论

相关推荐

    acl C++跨平台库.rar

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

    acl框架库是一个C语言网络框架库,主要包含:服务器开发框架、同步异步网络通讯、常用数据结构、进程池线程池、流式xmljson

    ACL框架库是一个专为C语言设计的网络框架,它提供了丰富的功能,使开发者能够更高效地构建网络应用程序。这个框架的核心特性包括服务器开发框架、同步和异步网络通信机制、常用的数据结构、进程池和线程池管理,以及...

    acl库 (advanced c library)

    ACL库,全称为Advanced C Library,是一个为C程序员设计的跨平台库,旨在提供一系列高效且易用的数据处理算法,以及强大的服务器框架。这个库特别适合于开发需要高性能、高并发性和良好扩展性的网络应用程序。在本文...

    acl 工程是一个跨平台的网络通信库及服务器编程框架,同时提供更多的实用功能库

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

    acl库,编译好的库文件

    ACL库,全称为Access Control List,是一个用于处理和管理权限控制的软件库。在IT行业中,权限控制是系统安全的重要组成部分,特别是在多用户环境中,确保每个用户只能访问他们被授权的资源至关重要。ACL库通常提供...

    掌握ACL的配置方法

    完成配置后,你可以通过`show ip access-lists`和`show ip interface FastEthernet0/0`命令检查ACL是否生效,同时使用`ping`和`traceroute`测试PC1到DNS Server的连通性。 总之,理解并熟练掌握ACL的配置方法对于...

    ACL 进行网络流量的控制1

    知识点一:什么是 IP ACL? IP ACL(IP 访问控制列表或 IP 访问列表)是实现对流经路由器或交换机的数据包根据一定的规则进行过滤,从而提高网络可管理性和安全性。 知识点二:IP ACL 的分类 IP ACL 分为两种:...

    acl.2.1.2.8.src.2012.7.2.zip_ACL_ACL_http_http json_协议

    ACL(Access Control List)框架库是一个专为C语言设计的开源库,它的核心目标是提供一个高效且灵活的服务器开发框架。这个库包含了多种关键组件,使得开发者在构建网络服务时能够快速、稳定地实现复杂的功能。以下...

    acl工程是一个跨平台的网络通信库及服务器编程框架,同时提供更多的实用功能库,支持LINUX,WIN32,Solaris,Mac

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

    实验:使用基本ACL限制公司网络访问.docx

    本实验"使用基本ACL限制公司网络访问"旨在让学生深入理解并掌握如何通过访问控制列表(ACL)来实现这一目标。实验主要涉及了eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)、ACL、VLAN以及三层...

    acl-master.zip

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

    acl-master

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

    IP网络技术中的ACL的gns3文件

    标题"IP网络技术中的ACL的gns3文件"表明这是一个关于IP网络技术的实践案例,特别是涉及到访问控制列表(Access Control List, ACL)的应用,且使用了GNS3(Generic Network Simulator 3)这个网络模拟工具。...

    acl,一个用于Linux、Mac、FreeBSD、Solaris(x86)、Windows、Android、iOS的高级C/C++库.zip

    例如,你可以使用ACL库来创建一个新的ACL,添加或删除特定用户或组的权限,或者检查现有文件的ACL设置。 对于Windows系统,ACL同样扮演着关键的角色,但其工作方式略有不同。Windows的安全模型基于安全标识符(SID...

    acl,natdhcp配置

    - 扩展ACL:除了源IP地址外,还考虑目标IP地址、协议类型(如TCP、UDP、ICMP)和端口号等,提供更细粒度的控制。 2. **ACL配置步骤**: - 创建ACL:在路由器或交换机上定义一个ACL,分配编号,并设置规则。 - ...

    cpp-acl工程是一个跨平台的网络通信库及服务器编程框架

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

    扩展ACL的应用实例及解析.docx

    "扩展ACL的应用实例及解析" 扩展ACL(Access Control List,访问控制列表)是一种网络安全机制,用于控制网络流量,保护网络资源。扩展ACL是标准ACL的升级版本,具有更多的灵活性和功能性。 扩展ACL的分类: 1. ...

    ACL访问控制协议PPT

    标准ACL(编号1-99)基于源IP地址进行过滤,而扩展ACL(编号100-199)则可以基于源和目标IP地址、端口号以及协议类型等更丰富的条件来过滤数据包。 **四、通配符掩码的作用** 通配符掩码是与IP地址配合使用的,它...

    acl 框架库 v3.6.1.6.zip

    ACL(Access Control List)框架库是一个用于权限管理的开源库,尤其在软件开发中,它对于构建具有精细访问控制功能的应用程序至关重要。v3.6.1.6是该库的一个特定版本,提供了稳定性和功能性的增强。在这个压缩包中...

Global site tag (gtag.js) - Google Analytics