在 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
分享到:
相关推荐
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
c语言基础 acl框架库是一个C语言网络框架库,主要包含:服务器开发框架、同步异步网络通讯、常用数据结构、进程池线程池、流式xmljson解析器、httpping应用协议等内容.zip
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
acl 框架库是一个 C 库,主要包含:服务器开发框架、同步/异步网络通讯、常用数据结构、进程池/线程池、流式 xml/json 解析器、http/ping 应用协议等内容。 acl 包括以下丰富的常用函数库: 1、常见网络应用库:SMTP...
cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置详解及配置全过程cisco最完美的ACL配置...
acl库,编译好的库文件,直接下载解压缩就能用;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现)、lib_acl_cpp(基于 lib_acl 及 lib_protocol 两个C库,提供了更为强大的...
前端开源库-acl基于Redis的访问控制列表模块acl,支持快速中间件
基于acl库封装的redis client vs2010工程; 运行时解压到: redis-acl\lib_acl_cpp\samples\redis路径下,把lib_acl_vc2010d.lib、lib_acl_cpp_vc2010d.lib放到 \redis-acl\lib_acl_cpp\samples\redis\redisclient...
该库跨平台的、支持常见数据算 法、有很好的服务器框架、支持线程池/进程池、支持同步/异步通信、简单易用可扩展、支持HTTP协议、ICMP协议、DNS协议等
acl 框架库是一个 C 库,主要包含:服务器开发框架、同步/异步网络通讯、常用数据结构、进程池/线程池、流式 xml/json 解析器、http/ping 应用协议等内容
本实验使用基本ACL限制公司网络访问,三层交换机的访问策略主要是通过ACL访问控制列表对不同VLAN的IP地址段进行流量匹配控制。
acl 框架库是一个 C 库,主要包含:服务器开发框架、同步/异步网络通讯、常用数据结构、进程池/线程池、流式 xml/json 解析器、http/ping 应用协议等内容;
常见的访问控制列表种类有:IP标准ACL、IP扩展ACL、IPX 标准ACL、IPX 扩展ACL、48 位MAC 地址ACL 和协议ACL 等等。IP相关的访问控制列表主要分为以下几类: ⑴ 标准IP访问控制列表 标准IP访问控制列表匹配IP包中的...
2、学习目标:配置交换机基础环境,配置路由器基础环境,配置基本ACL访问控制 3、应用场景:使用基本ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的...
ACL在IP网络中的应用