网络主机发现程序
- 格式:doc
- 大小:29.00 KB
- 文档页数:6
简单描述iscsi工作流程iSCSI是一种用于在IP网络上传输SCSI命令的协议,它使得远程主机可以通过网络访问存储设备。
iSCSI工作流程包括初始化、发现、登录、传输和终止五个主要阶段。
首先是初始化阶段。
在此阶段,iSCSI初始化器(即发起端)通过初始化器驱动程序发送一个iSCSI请求到目标端的iSCSI引导服务器,请求建立一个iSCSI会话。
初始化器驱动程序负责将本地主机上的SCSI命令转换为iSCSI请求,并将其发送到网络上。
接下来是发现阶段。
在此阶段,目标端的iSCSI引导服务器会回复一个iSCSI响应,其中包含目标端上可用的iSCSI目标设备的信息。
初始化器根据这些信息选择要连接的目标设备。
然后是登录阶段。
在此阶段,初始化器发送一个iSCSI登录请求到目标设备,请求建立一个iSCSI会话。
目标设备通过验证初始化器的身份并分配一个唯一的ISID(iSCSI会话标识符)和TSIH(iSCSI 传输会话标识符)给该会话。
初始化器接受这些标识符,并与目标设备建立起一条逻辑连接。
接着是传输阶段。
在此阶段,初始化器通过iSCSI会话向目标设备发送SCSI命令,目标设备接收并处理这些命令,并将响应发送回初始化器。
传输阶段使用TCP/IP协议,以确保数据的可靠传输。
最后是终止阶段。
在此阶段,初始化器发送一个iSCSI注销请求到目标设备,请求终止当前的iSCSI会话。
目标设备收到注销请求后,终止与初始化器的逻辑连接,并释放该会话使用的资源。
总的来说,iSCSI工作流程包括初始化、发现、登录、传输和终止五个主要阶段。
通过这些阶段,远程主机可以使用iSCSI协议在IP网络上访问存储设备。
iSCSI的优势在于通过使用现有的IP网络基础设施,提供了一种廉价、灵活且易于管理的存储解决方案。
同时,iSCSI也具备与SCSI相似的性能和功能,能够满足大多数存储需求。
网络安全中的漏洞扫描技术的使用方法随着互联网的迅猛发展,人们对网络安全的重视程度也日益增加。
作为网络安全的重要组成部分,漏洞扫描技术是一种通过全面检测和分析网络系统、应用程序和设备中潜在漏洞的方法。
本文将介绍一些常用的漏洞扫描技术以及它们的使用方法,帮助用户更好地保护自己的网络安全。
漏洞扫描技术通过模拟黑客攻击的方法,主动测试系统和应用程序的安全性。
它可以帮助用户发现并修复系统中存在的漏洞,以防止黑客利用这些漏洞获取非法访问权限。
以下是几种常用的漏洞扫描技术的使用方法:1. 主机扫描主机扫描是一种通过扫描网络设备和主机的端口和服务来检测漏洞的方法。
它可以帮助用户发现未关闭的端口以及运行不安全服务的主机。
使用主机扫描技术时,用户需要输入目标主机的IP地址,并选择扫描类型(如快速扫描、完全扫描等),扫描工具将自动识别主机上存在的漏洞,并生成扫描报告。
用户可以根据报告中的信息及时修复漏洞,以提高系统的安全性。
2. Web应用扫描Web应用扫描技术是一种针对网站和Web应用程序进行漏洞检测的方法。
它可以检测常见的Web安全漏洞,如跨站脚本攻击(XSS)、SQL注入攻击等。
在使用Web应用扫描技术时,用户需要输入目标网站的URL,并选择扫描类型,扫描工具将自动对目标网站进行检测,并生成扫描报告。
用户可以根据报告中的漏洞信息,及时修复漏洞以保护网站的安全。
3. 漏洞数据库扫描漏洞数据库扫描技术是一种通过对已知漏洞数据库的查询,检测系统和应用程序中可能存在的漏洞的方法。
用户可以使用漏洞数据库扫描工具,输入目标系统和应用程序的版本号,扫描工具将自动查询漏洞数据库,找出与目标系统和应用程序匹配的漏洞,并生成扫描报告。
用户可以根据报告中的漏洞信息及时更新系统和应用程序,以提高安全性。
4. 恶意软件扫描恶意软件扫描技术是一种通过扫描系统和应用程序中的文件和代码,检测恶意软件的方法。
用户可以使用恶意软件扫描工具,对系统和应用程序进行扫描,并生成扫描报告。
网络资产探测流程
一、初始设定
1.确定探测目标
(1)确定需探测的网络范围
(2)确定探测的具体资产类型
2.配置探测工具
(1)选择合适的探测工具
(2)配置工具参数
二、主机探测
1.扫描活动主机
(1)使用端口扫描工具
(2)确定活跃主机
2.识别操作系统和服务
(1)识别主机的操作系统
(2)列出运行的服务
三、网络设备探测
1.发现网络设备
(1)扫描网络设备
(2)记录设备IP地址
2.确认设备类型
(1)确认设备品牌和型号(2)判断设备功能和服务
四、漏洞扫描
1.执行漏洞扫描
(1)使用漏洞扫描工具
(2)发现系统和应用程序漏洞2.分析漏洞风险
(1)评估漏洞的严重程度(2)制定漏洞修复计划
五、数据采集
1.收集资产信息
(1)收集主机和设备信息(2)记录IP地址和端口信息2.存储数据
(1)建立资产清单
(2)存储探测结果数据
六、结果分析
1.数据比对
(1)比对实际资产与预期资产(2)分析差异和潜在风险
2.生成报告
(1)汇总探测结果
(2)提出改进建议。
[+]Nmap扫描原理与用法2012年6月16日1Nmap介绍Nmap基本命令和典型用法•全面进攻性扫描(包括各种主机发现、端口扫描、版本扫描、OS扫描及默认脚本扫描):nmap -A -v targetip•Ping扫描:nmap -sn -v targetip•快速端口扫描:nmap -F -v targetip•版本扫描:nmap -sV -v targetip•操作系统扫描:nmap -O -v targetip2Nmap扫描原理与用法PDF:下载地址Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。
软件名字Nmap是Network Mapper的简称。
Nmap最初是由Fyodor在1997年开始创建的。
随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行安全必备工具之一。
最新版的Nmap6.0在2012年5月21日发布,详情请参见:。
一般情况下,Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。
Nmap 可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。
Nmap的优点:1. 灵活。
支持数十种不同的扫描方式,支持多种目标对象的扫描。
2. 强大。
Nmap可以用于扫描互联网上大规模的计算机。
3. 可移植。
支持主流操作系统:Windows/Linux/Unix/MacOS等等;源码开放,方便移植。
4. 简单。
提供默认的操作能覆盖大部分功能,基本端口扫描nmap targetip,全面的扫描nmap –A targetip。
5. 自由。
Nmap作为开源软件,在GPL License的范围内可以自由的使用。
6. 文档丰富。
Nmap官网提供了详细的文档描述。
Nmap作者及其他安全专家编写了多部Nmap 参考书籍。
7. 社区支持。
Nmap背后有强大的社区团队支持。
计算机网络课程设计报告班级:计科141班姓名:xx(20141514112)xx(20141514129)xx(20141514118)题目:发现网络中活动的主机指导教师:xx日期:2016年6月24日发现网络中活动的主机一、问题描述1.设计目的:对于计算机实验室人员以及对宿舍局域网进行网络管理时,常常需要确定当前网络中处于活动状态的主机。
Ping命令利用ICMP回射请求报文和回射应答报文来测试目标系统是否可达。2.设计要求:编制程序,其功能是利用Ping命令通过发送数据包并接收应答信息来检测两台计算机之间的网络是否连通,以获取指定网段中的活动主机,并将结果显示在标准输出上。
二、概要设计1.主流程图:2.子流程图:三、详细设计1、获取本机IP(IpAddress类)package zx.huoquwangluozhuji;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/**** @获取本机IP**/public class IpAddress {public static String getIpAddress() {InputStreamReader isr = null;BufferedReader br = null;String system = System.getProperty("").toUpperCase();try {Process pro = null;if (system.indexOf("WINDOWS") > -1)pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig /all");elseSystem.out.println("不是windows系统");if (pro != null) {isr = new InputStreamReader(pro.getInputStream());br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {// System.out.println(line);if (line.indexOf("IP Address") > -1) {int beginIndex = stIndexOf(":") + 2;int endIndex = line.length();line = line.substring(beginIndex, endIndex);return line;} else if (line.indexOf("IPv4 地址") > -1) {int beginIndex = stIndexOf(":") + 2;int endIndex = line.length() - 5;line = line.substring(beginIndex, endIndex);return line;}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (br != null)br.close();if (isr != null)isr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "err";}}2、获取活动的主机(GetActivetyName类)package zx.huoquwangluozhuji;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/**** @获取网络中活动的主机**/public class GetActivityName extends Thread {private int startIP, endIP;private String IPHead;public GetActivityName(String IPHead, int startIP, int count) {// TODO Auto-generated constructor stubthis.IPHead = IPHead;this.startIP = startIP;this.endIP = startIP + count;}public void run() {for (int i = startIP; i <= endIP; i++) {if (i > 255)break;String ip = IPHead + "." + i;InputStreamReader isr = null;BufferedReader br = null;String system = System.getProperty("").toUpperCase();Process pro = null;try {pro = null;if (system.indexOf("WINDOWS") > -1) {pro = Runtime.getRuntime().exec("cmd.exe /c ping " + ip);} else {System.out.println("不是windows系统");}if (pro != null) {isr = new InputStreamReader(pro.getInputStream());br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {if (line.indexOf("TTL") > 0) {System.out.println(ip + "在线");break;}if (line.indexOf("超时") > 0 || line.indexOf("无法") > 0) {break;}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (br != null)br.close();if (isr != null)isr.close();if (pro != null)pro.destroy();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}3、开始(Start类)package zx.huoquwangluozhuji;public class Start {private static int COUNT = 3;public static void main(String[] args) {// TODO Auto-generated method stubString ip = IpAddress.getIpAddress();String[] temp = ip.split("\\.");new Start();System.out.println("----------该网络中活动的主机----------");for (int i = 1; i <= 255; i = i + COUNT) {ip = temp[0] + "." + temp[1] + "." + temp[2];new GetActivityName(ip, i, COUNT - 1).start();}}public Start() {// TODO Auto-generated constructor stubdoShutdownWork();}private void doShutdownWork() {Runtime runtime = Runtime.getRuntime();runtime.addShutdownHook(new Thread() {public void run() {System.out.println("------------结束------------");}});}}四、系统的运行结果(系统的使用方法介绍)1、运行要求:1)、系统环境操作系统WindowsXP或以上2)、软件环境 JDK 1.72、系统的使用方法:在同一局域网内,运行Start程序,就可以获取网络中正在活动的主机。
Nmap使用手册1. nmap介绍Nmap是一款网络扫描和主机检测的非常有用的工具。
Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。
它可以适用于winodws,linux,mac等操作系统Nmap是一款非常强大的实用工具,可用于:检测活在网络上的主机(主机发现)检测主机上开放的端口(端口发现或枚举)检测到相应的端口(服务发现)的软件和版本检测操作系统,硬件地址,以及软件版本检测脆弱性的漏洞(Nmap的脚本)Nmap是一个非常普遍的工具,它有命令行界面和图形用户界面。
本人包括以下方面的内容:介绍Nmap扫描中的重要参数操作系统检测Nmap使用教程Nmap使用不同的技术来执行扫描,包括:TCP的connect()扫描,TCP反向的ident扫描,FTP 反弹扫描等。
所有这些扫描的类型有自己的优点和缺点,我们接下来将讨论这些问题。
Nmap的使用取决于目标主机,因为有一个简单的(基本)扫描和预先扫描之间的差异。
我们需要使用一些先进的技术来绕过防火墙和入侵检测/防御系统,以获得正确的结果。
Nmap自动判断主机存活。
2.nmap基本的命令和用法的例子2。
1 扫描单一的一个主机:#nmap 192.168.1。
22.2 扫描整个子网:#nmap 192.168。
1.1/242。
3 扫描多个目标:#nmap 192。
168。
1。
2 192。
168.1。
52。
4 扫描一个范围内的目标:#nmap 192.168。
1。
1—100 (扫描IP地址为192。
168。
1.1—192.168。
1。
100内的所有主机)2.5 如果你有一个ip地址列表,将这个保存为一个txt文件,和namp在同一目录下,扫描这个txt内的所有主机:#nmap —iL target.txt2。
6 如果你想看到你扫描的所有主机的列表:#nmap —sL 192。
168。
1.1/242.7 扫描除过某一个ip外的所有子网主机:#nmap 192。
计算机网络课程设计一、设计内容及设计要求1.1课程设计内容:利用ICMP数据包,通过使用ICMP的回送和回送响应消息来确定当前网络中处于活动状态的主机,即ping消息的请求和应答,将发送的ICMP的数据包类型设置为回送请求(类型号为8),并显示在标准输出上。
用命令行形式运行:scanhost Start_IP End_IP,其中scanhost 为程序名;Start_IP为被搜索网段的开始IP;End_IP为被搜索网段的结束IP地址。
1.2课程设计目的:IP协议的优点是简单,但缺少差错控制和查询机制,而网际控制报文协议(ICMP具有补充IP功能的作用。
在网络管理中,常常要确定当前网络在红处于活动状态的主机,这时可以通过ICMP的回送和回送响应消息来完成这项工作。
这课程设计的目的就是编制程序,利用ICMP数据包,发现网络中的活动主机,即ping消息的请求和应答。
通过课程设计,熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识,培养综合运用网络知识解决实际问题能力。
1.3课程设计要求:设计程序,其功能是发送ICMP数据包,以获取指定望段中的活动主机,并将结果显示在标准输出设备上程序的具体要求如下:1.用命令形式运行scanhost为程序名;start_ip为被搜索网段;end_ip为被搜索网段的结束IP地址。
如在命令行输入scanhost 192.168.0.1 192.168.0.1002.输出格式活动主机1的IP地址活动主机2的IP地址活动主机n的IP地址二、总体设计2.1设计原理首先对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如图所示:ICMP报文的格式如图所示:0 7 8 15 16 31(位)所有报文的前4个字节都是一样的,但是其它字节则互不相同。
其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。
一课程设计名称:使用ARP发现局域网内活动主机——自行构造、发送ARP请求数据帧二使用工具软件:Microsoft Visual C++;winpcap;三课程设计内容简介:1 课程设计中涉及的网络基本理论简介:(1)在网际协议中定义的是因特网的IP地址,但在实际进行通信时,物理层不能识别IP地址只能识别物理地址。
因此,需在IP地址与物理地址之间建立映射关系,地址之间的这种映射称为地址解析。
(2)以太网网络中的物理地址即网卡的序列号。
IEEE规定网卡序列号为6个字节(48位),前三个字节为厂商代号,由于厂商向IEEE注册登记申请,后3个字节为网卡的流水号。
(3)地址解析包括从IP地址到物理地址的映射和从物理地址到IP地址的映射。
TCP/IP协议组提供了两个映射协议:地址解析协议ARP和逆向地址解析协议RARP。
ARP用于从IP地址到物理地址的映射,RARP用于从物理地址到IP地址的映射。
(4)地址解析协议的ARP的工作原理:假定在一个物理网络上,A(源主机)要与D(目的主机)进行通信,但是不知道D的物理地址。
A利用ARP协议工作的过程如下:A广播一个ARP请求报文,请求IP地址为IPD的主机回答其物理地址。
网上所有主机都能收到该ARP请求,并将本机IP地址与请求的IP 地址比较,D主机识别出自己的地址IPD,并作出回应,通报自己的物理地址。
A收到这个ARP回应包后,就可以与D进行通信。
为了提高效率,ARP协议使用了高速缓存技术。
在每台使用ARP的主机中,都保留了一个专用的内存区,一收到ARP应答,主机就将获得的IP地址和物理地址存入缓存。
以后每次要发送报文时,首先到缓存中查找有无相应的项,若找不到,再利用ARP进行地址解析。
由于多数网络通信都要连续发送多个报文,所以高速缓存大大提高ARP的效率。
在ARP请求报文中还放入源主机的“IP地址——物理地址”的地址对,源主机在广播ARP请求时,网络上所有主机都可以知道该源主机的“IP地址——物理地址”的地址对并将其存入自己的缓存。
网络信息安全事件处置流程随着互联网的迅猛发展,网络安全问题日益凸显。
网络信息安全事件的发生给个人、企业和国家带来了巨大的损失和威胁。
为了有效应对网络信息安全事件,各个组织和机构都需要建立一套完善的处置流程。
本文将介绍网络信息安全事件处置的流程,并探讨其中的关键环节。
一、事件发现与报告网络信息安全事件的发现是处置的第一步。
通常情况下,网络信息安全事件的发现可以通过安全监控系统、入侵检测系统、日志分析等手段进行。
一旦发现异常情况,相关人员应立即报告给网络安全团队。
报告内容应包括事件的类型、时间、地点、受影响的系统和数据等信息。
二、事件评估与分类在收到报告后,网络安全团队需要对事件进行评估和分类。
评估的目的是确定事件的严重程度和影响范围,以便采取相应的处置措施。
根据事件的类型和性质,可以将网络信息安全事件分为恶意代码攻击、网络入侵、数据泄露等不同的类别。
三、事件响应与隔离根据事件的评估结果,网络安全团队需要迅速采取措施进行事件响应和隔离。
响应的目标是尽快停止事件的扩散和恶化,保护关键系统和数据的安全。
隔离的目的是将受影响的系统与网络与其他正常运行的系统和网络隔离开来,以防止事件的蔓延。
事件响应和隔离的具体措施包括但不限于:停止受感染的主机或系统的网络连接、隔离受感染的主机或系统、关闭受感染的服务或应用程序、清除恶意代码等。
四、事件调查与分析事件响应和隔离之后,网络安全团队需要进行事件的调查和分析。
调查的目的是确定事件的起因和过程,找出安全漏洞和弱点,以便采取措施加以修复和改进。
分析的目的是通过对事件的数据和日志进行分析,找出事件的规律和特征,以便预防类似事件的发生。
事件调查和分析的方法包括但不限于:检查受感染的主机或系统的日志、分析网络流量、追踪攻击者的IP地址、收集和分析恶意代码等。
五、事件修复与恢复在完成事件调查和分析后,网络安全团队需要采取措施对受影响的系统和网络进行修复和恢复。
修复的目标是修补安全漏洞和弱点,防止类似事件的再次发生。
网络安全应急预案中的恶意软件处理方法恶意软件(Malware)是指那些有意被开发用于盗取信息、破坏系统或者扰乱网络安全的软件程序。
它们可能以病毒、蠕虫、木马、间谍软件等不同形态存在。
在一个高度互联的时代,恶意软件的威胁普遍存在,因此,网络安全应急预案中的恶意软件处理方法至关重要。
本文将介绍常见的系统应对措施,并提供恶意软件处理的有效方法。
一、加强安全防护1. 安装杀毒软件和防火墙:杀毒软件和防火墙是防止恶意软件侵入系统的重要工具。
在网络设备和主机上安装并定期更新杀毒软件,使其能够识别和清除最新的恶意软件。
同时,防火墙应该配置并及时更新,以阻止未经授权的访问和可能的攻击。
2. 进行系统漏洞修补:及时修复系统漏洞也是预防恶意软件的关键步骤。
供应商经常发布针对漏洞的安全更新,确保及时安装这些更新以保持系统的安全。
3. 不打开未知来源的附件: 恶意软件常常通过电子邮件等渠道传播。
用户应该避免打开未知发件人或可疑邮件中的附件或链接,因为这些可能是恶意软件的传播手段之一。
二、发现恶意软件1. 定期全面扫描:定期全面扫描系统文件和目录,检测潜在的恶意软件。
建议使用多款活跃的杀毒软件进行扫描,以提高准确性。
2. 监测网络流量:通过监测网络流量,及时发现异常情况。
若发现大量请求连接到未知IP地址或与恶意软件相关的域名,应及时隔离和处理。
3. 日志分析:分析系统和网络日志,发现异常的活动。
特别关注系统性能、错误日志和访问日志中的异常行为,能够为发现恶意软件提供线索。
三、处理恶意软件1. 隔离受感染的主机:一旦发现恶意软件,立即隔离受感染的主机或网络,以阻止恶意软件对其他主机的侵害。
对于大型网络,可使用边界设备,如防火墙和入侵检测系统,隔离受感染的主机。
2. 清除恶意软件:清除恶意软件是恢复安全的首要任务。
使用已更新的杀毒软件对受感染的主机进行全面扫描,并彻底清除恶意软件。
3. 恢复系统和数据:及时备份和恢复数据是处理恶意软件的重要环节。
#pragma pack(4)#pragma comment(lib,"Ws2_32.lib")#define win32_LEAN_AND_MEAN#include <winsock2.h>#include <stdio.h>#include <iostream.h>#include <string.h>#include <stdlib.h>#include <sys/timeb.h>#include <time.h>//THE IP HEADERtypedef struct iphdr{unsigned int headlen:4; //ip头长度unsigned int wersion:4; //ip版本号unsigned char tos; //服务类型unsigned short totallen; //ip包总长度unsigned short id; //ip号unsigned short flag; //标记unsigned char ttl; //生存时间unsigned char prot; //协议(UDP TCP)unsigned short checksum; //校验和unsigned int sourceip; //源ipunsigned int destip; //目的ip}IpHeader;//ICMP HEADERtypedef struct icmphdr{BYTE type; //icmp类型码,回送请求的类型码为8BYTE code; //子类型码,保存与特定ICMP报文类型相关的//节信息USHORT checksum; //校验和USHORT id; //ICMP报文id号USHORT seq; //ICMP数据报的序列号}Icmpheader;#define ICMP_ECHO 8 //请求回送#define ICMP_ECHO_REPLY 0 //请求回应#define ICMP_MIN 8 //ICMP包头长度(最小ICMP包长度)#define STA TUS_FAILED 0xFFFF //错误码#define DEF_PACKET_SIZE 32 //缺省数据报长度#define MAX_PACKET 1024 //最大数据报长度#define MAX_PING_PACKET_SIZE (MAX_PACKET + sizeof(IpHeader)) //最大接受数据报长度void fill_icmp_date(char * ,int); //填充ICMP包USHORT checksum(USHORT *,int); //校验和函数void decode_resp(char*,int,struct sockaddr_in *); //找到此数据报IP地址DWORD WINAPI FindIp(LPVOID pipaddrtemp); //线程调用子函数WSADA TA wsadata;SOCKET sockraw;struct sockaddr_in dest,from,end;int fromlen=sizeof(from);char * recvbuf=new char[MAX_PING_PACKET_SIZE];unsigned int addr=0;long threadnumcounter=0,threadnumlimit=20;long *aa=&threadnumcounter;void main(){char *in_ip="192.168.0.1";char *end_ip="192.168.0.10";cout<<"请输入起始扫描地址,和终止扫描地址,格式"<<endl<<"IP1"<<endl<<"IP2"<<endl;if(WSAStartup(MAKEWORD(2,1),&wsadata)!=0){/*对Winsock服务的初始化*/ cout<<"WSAStartup failed:"<<GetLastError()<<endl;ExitProcess(STA TUS_FAILED);}//创建原始套接字sockraw=WSASocket(AF_INET,SOCK_RA W,IPPROTO_ICMP,NULL,0,WSA_FLAG_OV ERLAPPED);//创建一个与指定传送服务提供者捆绑的套接口,可选地创建和/或加入一个套接口组if(sockraw==INV ALID_SOCKET){cout<<"WSASocket() failed:"<<WSAGetLastError()<<endl;ExitProcess(STA TUS_FAILED);}//设置读取延时int timeout=1000;intbread=setsockopt(sockraw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));//s etsockopt()函数用于任意类型、任意状态套接口的设置选项值if(bread==SOCKET_ERROR){cout<<"fail to set recv timeout:"<<WSAGetLastError()<<endl;ExitProcess(STA TUS_FAILED);}memset(&dest,0,sizeof(dest));//将dest中的N 个字节替换成“0”,起清零作用unsigned long startip,endip;dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(in_ip);startip=inet_addr(in_ip);end.sin_family=AF_INET;end.sin_addr.s_addr=inet_addr(end_ip);endip=inet_addr(end_ip);HANDLE hthread;while(htonl(startip)<=htonl(endip)){//将主机的无符号长整形数转换成网络字节顺序。
if(threadnumcounter>threadnumlimit){Sleep(5000);continue;}DWORD Threadid;sockaddr_in * pipaddrtemp=new(sockaddr_in);if(!pipaddrtemp){cout<<"memory alloc failed"<<endl;return;}*pipaddrtemp=dest;//创建新线程clock_t start;start=clock();hthread=CreateThread(NULL,NULL,FindIp,(LPVOID)pipaddrtemp,NULL,&Threadid);//CreateThread(线程安全属性,堆栈大小, 线程函数,线程参数, 线程创建属性,线程ID )long i=60000000L;while(i--);TerminateThread(hthread,0);/*在线程外终止一个线程,用于强制终止线程*/InterlockedDecrement(aa);//递减指定变量的值并存储结果memset(&from,0,sizeof(from));startip=htonl(htonl(startip)+1);dest.sin_addr.s_addr=startip;}while(threadnumcounter!=0){Sleep(2000);return;}}void fill_icmp_data(char * icmp_data,int datasize){Icmpheader *icmp_hdr;char *datapart;icmp_hdr=(Icmpheader*)icmp_data;icmp_hdr->type = ICMP_ECHO;icmp_hdr->id=(USHORT)GetCurrentThreadId();datapart=icmp_data+sizeof(Icmpheader);memset(datapart,'A',datasize-sizeof(Icmpheader));}void decode_resp(char *buf,int bytes,struct sockaddr_in *from){ IpHeader *iphdr;Icmpheader *icmphdr;unsigned short iphdrlen;iphdr=(IpHeader *)buf;;//从buf中获取IP数据包头指针iphdrlen=iphdr->headlen * 4;icmphdr=(Icmpheader *)(buf+iphdrlen);//定位ICMP包头起始位置//数据包太短丢弃if(bytes<iphdrlen+ICMP_MIN) return;if(icmphdr->type!=ICMP_ECHO_REPLY) return;if(icmphdr->id!=(USHORT)GetCurrentThreadId()) return;{cout<<"活动主机"<<inet_ntoa(from->sin_addr)<<endl;}}USHORT checksum(USHORT *buffer,int size){unsigned long cksum=0;while (size>1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum & 0xffff);cksum+=(cksum>>16);return (USHORT)(~cksum);}DWORD WINAPI FindIp(LPVOID pipaddrtemp){InterlockedIncrement(aa);char icmp_data[MAX_PACKET];memset(icmp_data,0,MAX_PACKET);int datasize=DEF_PACKET_SIZE;datasize+=sizeof(Icmpheader);fill_icmp_data(icmp_data,datasize);((Icmpheader*)icmp_data)->checksum=0;((Icmpheader*)icmp_data)->seq = 0;//计算校验和后填入((Icmpheader*)icmp_data)->checksum=checksum((USHORT*)icmp_data,datasize);int bwrote=sendto(sockraw,icmp_data,datasize,0,(struct sockaddr*)pipaddrtemp,sizeof(dest));//将指定字节数的数据发送到指定的终结点//sendto(套接字;待发送数据的缓冲区;缓冲区长度;调用方式标志位一般为0,改变Flags 将会改变Sendto发送的形式;(可选)指针,指向目的套接字的地址;所指地址的长度)int n=0;if (bwrote==SOCKET_ERROR){if(WSAGetLastError()==WSAETIMEDOUT){cout<<"timed out"<<endl;}cout<<"sendto failed: "<<WSAGetLastError()<<endl;ExitProcess(STA TUS_FAILED);n=1;}if(bwrote<datasize){cout<<"worte "<<bwrote<<" bytes"<<endl;ExitProcess(STA TUS_FAILED);n=1;}int bread =recvfrom(sockraw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr*) &from,&fromlen);//recvfrom(套接口的描述字,接收数据缓冲区,缓冲区长度,指向装有源地址from的缓冲区,from缓冲区长度,)if(bread==SOCKET_ERROR){if(WSAGetLastError()==WSAETIMEDOUT){cout<<"time out"<<endl;}cout<<"recvform failed:"<<WSAGetLastError()<<endl;ExitProcess(STA TUS_FAILED);n=1;}if(n==0)decode_resp(recvbuf,bread,&from);InterlockedDecrement(aa);return 0;}。