扫描在线设备(优化)

来源:互联网 发布:网络搜索引擎优化 编辑:程序博客网 时间:2024/04/29 20:42

icmp是目前最便捷通用的判断主机是否在线的方式。说更浅显一点就是ping.

自己写一个ping,就是使用socket向目标发送icmp数据包,根据收到的icmp数据包中的类型,代码字段判断ping的主机是否在线。(在线的含义为,与请求主机在互相可达的网络中,并且tcp/ip协议正常安装运行)

实现上面这个步骤是基础。下面要优化获取一个网段的主机了!

使用逐一ping的方式固然可以完成这个工作。但是,试想,如果一个192.168.1.0/24的网络,只有192.168.1.254在线,二其他主机都不可达,那么要每一个读等到超时后,再判断下一个主机在线?

这种令人不快的结果似乎在tcp协议中就有现成的解决方案。没错——滑动窗口。

滑动窗口的精髓,就是在发送出去一个package之后,异步的发送下一个package,直到发送数量达到窗口大小;等收到一个Package之后,就可以移动窗口,继续发送下一个package了。以此来避免阻塞,等待。



OK,基于这样的设计,可以使用fd_set这样的读写选择结构,源码中可以看到fd_set的空间限制是64个file_handle,所以一次开启的读监听socket为64个以内。当收到其中一个的回响后,发送新的icmp包,继续在fd_set上阻塞。那么之前的假设便是:1-64耗费4秒钟(4秒钟超时),65-128耗费4秒钟,129-192耗费4秒钟,193-254耗费4秒钟。并最终成功得到254在线的信息。

使用先人的智慧,运用在今天的问题上。

0 0