计算机网络课程设计++端口扫描++实验报告材料

合集下载

网络端口扫描

网络端口扫描

电子信息工程学系实验报告 ——适用于计算机课程课程名称:信息安全技术实验项目名称:网络端口扫描 实验时间:2011-9-26班级: 姓名: 学号:实 验 目 的:1.通过练习使用网络端口扫描器,了解目标主机开放的端口和服务程序,从而获得系统有用的信息,发现网络系统的安全漏洞。

2.在Windows 操作系统下使用Superscan 工具进行网络端口扫描实验。

3.通过端口扫描实验,可以增强学生在网络安全方面的防护意识。

实 验 环 境:Windows 操作系统、虚拟机、Superscan 工具实 验 内 容 及 过 程:1、使用SuperScan 扫描工具对同一网段内所有主机进行端口扫描,完成后,任选2台主机(其中一台为本机),分析其端口开放情况,要求注明开放的各端口含义,以及可能带来的危害。

安装Superscan 工具后,打开该软件,在“Port list file ”中选择“hensss.lst ”,如下图:在“IP ”一栏中选择要扫描的IP 网段范围,然后单击“start ”开始扫描。

成 绩:指导教师(签名):虚拟机的IP地址设置为:选择如下两台主机进行分析:危害。

135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨包括HTTP协议在内的多种网络传输。

端口漏洞:有的病毒就是利用RPC漏洞来攻击计算机的。

RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。

该漏洞会影响到RPC与DCOM之间的一个接口,该接口侦听的端口就是135。

而139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix 中的Samba服务。

实验五 端口扫描器实验报告(付代码)

实验五 端口扫描器实验报告(付代码)

实验5:端口扫描器的设计与实现姓名:学号:专业年级:(一)实验目的和内容:目的:加深对TCP的理解,学习端口扫描技术和原理,熟悉socket编程。

内容:实现一个扫描器,使用TCP connect进行端口扫描,并对扫描结果进行记录。

(二)课程设计要求:Windows或Linux环境下,程序在单机上运行;使用端口扫描器对一台主机进行扫描,并显示出结果;编程语言不限;提供友好的用户界面。

(三)端口扫描技术:“端口”是专门为计算机通信而设计的,它不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。

“端口”是由计算机的通信协议TCP/IP协议定义的。

其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。

具体来说,就是用[IP:端口]来定位一台主机中的进程。

计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。

端口与进程是一一对应的,入侵者通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。

(四)扫描端口的目的:端口扫描是入侵者搜集信息的几种常用手法之一,也正是这一过程最容易使入侵者暴露自己的身份和意图。

•判断目标主机上开放了哪些服务;•判断目标主机的操作系统。

如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能够使用相应的手段实现入侵。

(五)端口的分类:端口是一个16 bit的地址,用端口号进行标识不同的作用。

端口一般分为两类。

•熟知端口号(公认端口号):由因特网指派名字和号码公司ICANN负责分配给一些常用的应用层程序固定使用的熟知端口,其数值一般为0~1023。

•一般端口号:用来随时分配给请求通信的客户进程。

(六)扫描原理的基础知识:TCP/IP模型四层结构TCP与UDP协议TCP报文结构TCP连接和释放过程(七)TCP/IP模型四层结构:(八)TCP与UDP协议:Internet的网络通信大多是建立在这两个协议之上的,各个主机遵循着TCP/IP协议封装数据包进行通信。

端口扫描报告

端口扫描报告

杭州电子科技大学软件学院网络工程试验报告端口扫描报告09109146王子龙1.端口及端口扫描技术简介 (2)2.对现有端口扫描工具程序的理解 (2)主界面 (3)3.核心代码 (6)4.个人总结 (13)1.端口及端口扫描技术简介根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。

计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。

对应这两种协议的服务提供的端口,也就分为TCP 端口和UDP端口。

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。

主机不只是靠IP地址来区分网络服务,因为IP 地址与网络服务的关系是一对多的关系。

实际上是通过“IP地址+端口号”来区分不同的服务的。

一个端口就是一个潜在的通信通道,也就是一个入侵通道。

对目标计算机进行端口扫描,能得到许多有用的信息。

进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。

在手工进行扫描时,需要熟悉各种命令。

对命令执行后的输出进行分析。

用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。

通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。

2. 对现有端口扫描工具程序的理解该程序是有C++编写的。

C++是一种使用非常广泛的计算机编程语言。

C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。

它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。

该程序能够扫描主机IP的某一个端口,或者是扫描该主机IP某一范围内的端口。

并且提供多次扫描功能。

如果要扫描的端口很多,在扫描过程中可以暂停扫描。

扫描结果在界面的下方显示。

主要显示内容有IP地址、端口号、端口状态、连接次数及备注。

网络端口扫描实验报告

网络端口扫描实验报告

一、实验目的1. 理解网络端口扫描的基本原理和作用。

2. 掌握常用的网络端口扫描工具,如Xscan、Nmap和流光等。

3. 学习如何进行网络端口扫描,并对扫描结果进行分析。

4. 了解网络端口扫描在网络安全中的应用。

二、实验环境1. 操作系统:Windows 102. 网络端口扫描工具:Xscan、Nmap、流光3. 实验网络:实验室内部局域网三、实验步骤1. 安装网络端口扫描工具(1)下载并安装Xscan、Nmap和流光等网络端口扫描工具。

(2)确保实验网络连接正常,打开扫描工具。

2. 使用Xscan进行端口扫描(1)在Xscan中输入目标IP地址或域名。

(2)选择扫描方式,如全端口扫描、快速扫描等。

(3)点击“开始扫描”按钮,等待扫描完成。

(4)查看扫描结果,了解目标主机开放的端口和服务。

3. 使用Nmap进行端口扫描(1)在Nmap中输入目标IP地址或域名。

(2)选择扫描选项,如-sT(全端口扫描)、-sS(半开放扫描)等。

(3)运行命令:nmap -sT 目标IP地址或域名。

(4)查看扫描结果,了解目标主机开放的端口和服务。

4. 使用流光进行端口扫描(1)在流光中输入目标IP地址或域名。

(2)选择扫描模式,如快速扫描、全端口扫描等。

(3)点击“开始扫描”按钮,等待扫描完成。

(4)查看扫描结果,了解目标主机开放的端口和服务。

5. 分析扫描结果(1)对比三种扫描工具的扫描结果,了解不同扫描工具的特点。

(2)分析目标主机开放的端口和服务,了解其可能存在的安全风险。

四、实验结果与分析1. Xscan扫描结果通过Xscan扫描,发现目标主机开放了80(HTTP)、21(FTP)、22(SSH)等端口。

2. Nmap扫描结果通过Nmap扫描,发现目标主机开放了80(HTTP)、21(FTP)、22(SSH)等端口,并获取了更详细的信息,如操作系统类型、服务版本等。

3. 流光扫描结果通过流光扫描,发现目标主机开放了80(HTTP)、21(FTP)、22(SSH)等端口,并提供了端口对应的程序信息。

实验二 网络端口扫描

实验二 网络端口扫描

实验二网络端口扫描一、实验目的通过练习使用网络端口扫描器,了解目标主机开放的端口和服务程序,从而获得系统有用的信息,发现网络系统的安全漏洞。

本实验将在Windows操作系统下使用Superscan工具进行网络端口扫描实验,在Linux操作系统下将使用综合性扫描工具Nessus进行扫描练习(暂不进行)。

通过端口扫描实验,可以增强学生在网络安全方面的防护意识。

二、实验原理在Internet安全领域,扫描器是最有效的破解工具之一,扫描器是一种自动检测远程或本地主机安全性弱点的程序。

通过使用扫描器,可以发现远程服务器是否存活、它对外开放的各种TCP端口的分配及提供的服务、它所使用的软件版本(如OS和其它Software的版本)以及所存在可能被利用的系统漏洞。

根据这些信息,可以让使用它的用户了解到远程主机所存在的安全问题。

1、扫描的类型(1)地址扫描地址扫描是最简单、最常见的一种扫描方式。

可以通过Ping来判断某一主机是否在线。

也可以通过一些工具来获得某一网络中所有在线主机的地址。

但由于现在很多的路由器与防火墙对ICMP请求进行拦截,因此这种方式也不一定很可靠。

(2)端口扫描互联网上通信的双方不仅需要知道对方的地址,还需要知道通信程序的端口号。

目前使用的IPv4协议支持16位的端号,端口号可使用的范围为0~65535,其中0~1023为熟知端口,被指定给特定的服务使用,由IANA(Internet Assigned Numbers Authority,互联网数字分配机构)管理;1024~49151为注册端口,这些端口由IANA记录并追踪;49152~65535端口叫做动态端口或专门端口,提供给专用应用程序。

在进行入侵攻击之前,首先要了解目标系统的是什么OS,是否有保护措施,运行什么服务和服务的版本,存在漏洞等,而要判断服务的方法就通过端口扫描,这是因为常用的服务是使用标准的端口,因此只要知道了端口号,就能知道目标主机上运行着什么服务,然后才能针对这些服务进行攻击。

portscan实验报告

portscan实验报告
return; } if ( LOBYTE( wsaData.wVersion ) != minorVer || HIBYTE( wsaData.wVersion ) != majorVer ) {
::WSACleanup(); return; } }
~CInitSock() {
::WSACleanup(); } };
实验环境:windows,C语言
实验内容:用C语言编写一个在linux下扫描局域网内主机的程序。要求可以显示局域
网内的主机名列表,IP地址列表,并可以显示哪些主机开放了哪些端口。
实验代码:
////////////////////////////////////////////////////////// //PortScan.cpp
//获得主机信息 void GetLocalDate( void );
//线程函数 DWORD WINAPI psProc(
LPVOID lpParameter );
// thread data
////////////////////////////////////////////////////////// //全局变量
};
//端口开放数量 int g_nOpenPorts;
////////////////////////////////////////////////////////// //类
//载入和释放Winsock2库的类 class CInitSock { public:
CInitSock( BYTE minorVer = 2, BYTE majorVer = 2) {
这种不能算是新方法,只是其它技术的变化。它并不是直接发送 TCP 探测数据包,是 将数据包分成两个较小的 IP 段。这样就将一个 TCP 头分成好几个数据包,从而过滤器就很 难探测到。但必须小心。一些程序在处理这些小数据包时会有些麻烦。

端口实验报告

端口实验报告

一、实验目的1. 了解端口扫描的基本概念和原理。

2. 掌握常用端口扫描工具的使用方法。

3. 学会分析端口扫描结果,识别潜在的安全风险。

二、实验环境1. 实验主机:Windows 10操作系统2. 实验工具:Nmap、Xscan、Nessus等端口扫描工具3. 实验对象:互联网上的目标主机三、实验内容1. 端口扫描概述2. 使用Nmap进行端口扫描3. 使用Xscan进行端口扫描4. 使用Nessus进行端口扫描5. 分析端口扫描结果四、实验步骤1. 端口扫描概述端口扫描是指通过网络发送特定数据包,检测目标主机上开放的服务端口的过程。

通过端口扫描,我们可以了解目标主机上运行的服务,从而评估其安全风险。

2. 使用Nmap进行端口扫描(1)安装Nmap:从官方网站下载Nmap安装包,按照提示进行安装。

(2)运行Nmap:在命令行中输入“nmap 目标IP”进行扫描。

(3)查看扫描结果:Nmap会生成一个文本文件,其中包含了扫描结果。

3. 使用Xscan进行端口扫描(1)安装Xscan:从官方网站下载Xscan安装包,按照提示进行安装。

(2)运行Xscan:在Xscan界面输入目标IP,点击“开始扫描”按钮。

(3)查看扫描结果:Xscan会生成一个HTML文件,其中包含了扫描结果。

4. 使用Nessus进行端口扫描(1)安装Nessus:从Tenable官方网站下载Nessus安装包,按照提示进行安装。

(2)运行Nessus:在Nessus界面输入目标IP,选择扫描模板,点击“开始扫描”按钮。

(3)查看扫描结果:Nessus会生成一个报告,其中包含了扫描结果。

5. 分析端口扫描结果(1)识别开放端口:根据扫描结果,找出目标主机上开放的端口。

(2)分析服务类型:根据开放端口,确定目标主机上运行的服务类型。

(3)评估安全风险:根据服务类型,评估目标主机的安全风险。

五、实验结果与分析1. 使用Nmap扫描目标主机,发现其开放了80、443、22、21等端口。

《网络安全》端口扫描与防护实验报告

《网络安全》端口扫描与防护实验报告

课程实验报告课程名称:网络安全技术实验项目名称:端口扫描专业班级:姓名:学号:指导教师:完成时间:2011 年9 月9 日计算机科学与工程系实验题目:端口扫描实验内容:(1)Nmap软件的使用。

(2)X-scan软件的使用。

(3)Protectx软件的测试。

实验结果:1、Nmap软件的使用。

实验中,我使用的是GUI的Zenamp。

如图1所示,它提供了一个下拉列表框,其中列出了常用的扫描方式。

图1 Zenamp常用扫描方式输入要扫描主机的IP地址,选择扫描方式,则自动生成扫描命令。

点击扫描按钮,则开始以选定的扫描方式扫描指定的主机。

图2为一个扫描实例。

图2 扫描结果2、X-scan软件的使用。

X-scan集成了一些常用的工具,比如物理地址查询、Trace route和Ping等,如图3所示。

图3 X-Scan集成小工具X-Scan功能很强大,可以对开放服务、漏洞以及弱口令进行扫描检测,通过采用并发扫描使得扫描速度异常的快,并且提供了多种扫描结果报告形式。

图4为其扫描参数的设置。

图4 X-Scan扫描参数设置使用X-Scan扫描一主机,结果如图5、6所示。

图5 X-Scan普通信息图6 X-Scan漏洞信息3、Protectx软件的使用。

ProtectX是一款用于保护计算机,防止被恶意扫描的软件。

如图7所示,它可以提供端口、木马等多种防护,当主机被恶意扫描的时候,ProtectX将会发出警告信息。

图7 ProtectX设置选项ProtectX也提供了一些Ping、Trace route等的实用小工具,如图8所示。

图8 ProtectX使用小工具实验总结:实验内容全部完成,通过此次实验,我学习到了漏洞扫描、端口扫描等的一些基本知识,并学会了使用一些常用的扫描工具及防护工具。

实验是在虚拟机上的两台主机上完成的,在搭建实验环境的过程中,我也学习了一些相关的知识。

实验一端口扫描

实验一端口扫描

实验一网络端口扫描一、实验目的通过练习使用网络端口扫描器,了解目标主机开放的端口和服务程序,从而获得系统有用的信息,发现网络系统的安全漏洞。

本实验将在Windows操作系统下使用Superscan工具进行网络端口扫描实验,通过端口扫描实验,可以增强学生在网络安全方面的防护意识。

二、实验原理在Internet安全领域,扫描器是最有效的破解工具之一,扫描器是一种自动检测远程或本地主机安全性弱点的程序。

通过使用扫描器,可以发现远程服务器是否存活、它对外开放的各种TCP端口的分配及提供的服务、它所使用的软件版本(如OS和其它Software的版本)以及所存在可能被利用的系统漏洞。

根据这些信息,可以让使用它的用户了解到远程主机所存在的安全问题。

1、扫描的类型(1)地址扫描地址扫描是最简单、最常见的一种扫描方式。

可以通过Ping来判断某一主机是否在线。

也可以通过一些工具来获得某一网络中所有在线主机的地址。

但由于现在很多的路由器与防火墙对ICMP请求进行拦截,因此这种方式也不一定很可靠。

(2)端口扫描互联网上通信的双方不仅需要知道对方的地址,还需要知道通信程序的端口号。

目前使用的IPv4协议支持16位的端号,端口号可使用的范围为0~65535,其中0~1023为熟知端口,被指定给特定的服务使用,由IANA(Internet Assigned Numbers Authority,互联网数字分配机构)管理;1024~49151为注册端口,这些端口由IANA 记录并追踪;49152~65535端口叫做动态端口或专门端口,提供给专用应用程序。

在进行入侵攻击之前,首先要了解目标系统的是什么OS,是否有保护措施,运行什么服务和服务的版本,存在漏洞等,而要判断服务的方法就通过端口扫描,这是因为常用的服务是使用标准的端口,因此只要知道了端口号,就能知道目标主机上运行着什么服务,然后才能针对这些服务进行攻击。

如对于开着23端口的目标主机,可以利用一些口令攻击工具对Telnet服务进行口令的暴力破解。

网络综合实验报告--端口扫描资料

网络综合实验报告--端口扫描资料

综合实验报告( 2016-- 2017年度第 1 学期)名称:网络综合实验题目:端口扫描程序设计与实现院系:计算机系班级:网络1301班学号:学生姓名:指导教师:李丽芬设计周数: 1 周成绩:日期:2017年1月13日网络综合实验任务书一、实验名称:端口扫描程序设计与实现二、目的与要求1.任务:设计并实现一个端口扫描程序,检测某个IP或某段IP的计算机的端口工作情况。

2.目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。

3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。

4.学生人数:1人。

三、主要内容1.编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作。

编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作。

(1)设定好一定的端口扫描范围,并设定每个端口扫描的次数,因为有可能有的端口一次扫描可能不通;(2)创建socket,通过socket的connect方法来连接远程IP地址以及对应的端口;(3)如果返回false,表示端口没有开放,否则端口开放;(4)选择其中一个活动端口,建立连接并发送一个数据块,服务器收到后原样返回客户端。

2.四、进度计划五、设计成果要求1.完成规定的实验任务,保质保量;2.完成综合实验报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对实验思路的归纳和对问题解决过程的总结。

六、考核方式1.平时成绩+验收答辩+实验报告;2.五级分制。

学生姓名:指导教师:李丽芬2017 年1 月9 日一、课程设计的目的与要求1.任务实现一个端口扫描程序,检测某个IP或某段IP的计算机的端口工作情况。

2.目的加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。

实训端口扫描软件实习报告

实训端口扫描软件实习报告

实习报告实训项目:端口扫描软件实习实习时间:2023年2月24日实习地点:XX公司网络实验室一、实习目的通过本次实习,了解端口扫描软件的作用和原理,掌握端口扫描软件的使用方法,提高对网络安全的认识,为公司的网络安全保驾护航。

二、实习内容1. 学习端口扫描软件的基本概念、作用和原理。

2. 学习端口扫描软件的使用方法,包括安装、配置和操作。

3. 进行实际操作,对公司的网络进行端口扫描,分析扫描结果。

4. 根据扫描结果,提出改进网络安全的建议。

三、实习过程1. 学习端口扫描软件的基本概念、作用和原理端口扫描软件是一种网络安全工具,用于扫描目标计算机上的开放端口,以发现可能存在的网络安全风险。

端口是计算机网络通信中,用于区分不同服务或应用程序的逻辑概念。

每个端口都对应着一种服务或应用程序,当端口处于开放状态时,表示相应的服务或应用程序正在运行。

通过端口扫描,可以了解目标计算机上运行的服务,发现可能的安全漏洞,从而采取措施进行防护。

2. 学习端口扫描软件的使用方法在实习过程中,我们使用了XX公司提供的端口扫描软件。

首先,我们需要安装软件,然后根据提示进行配置。

配置包括选择扫描的目标IP地址、端口范围、扫描方式等。

最后,开始扫描,等待扫描完成。

3. 进行实际操作,分析扫描结果根据配置,我们对公司的网络进行了端口扫描。

扫描结果显示,公司网络中存在一些开放端口,其中一些端口对应的服务是已知的安全风险。

我们对扫描结果进行了分析,发现以下问题:(1)部分服务器端的端口安全配置不当,存在被攻击的风险。

(2)部分员工计算机的端口开放,可能存在非法外联的情况。

(3)部分设备的端口处于关闭状态,但未进行安全防护,可能存在潜在风险。

4. 提出改进网络安全的建议针对扫描结果,我们提出了以下建议:(1)加强服务器端口的安全配置,关闭不必要的端口,对于必须开放的端口,采用安全策略进行防护。

(2)对员工计算机进行安全检查,关闭不必要的端口,防止非法外联。

实验总结报告

实验总结报告

实验总结报告实验总结报告「篇一」一、实验目的通过练习使用网络端口扫描器,可以了解目标主机开放的端口和服务程序,从而获取系统的有用信息,发现网络系统的安全漏洞。

在实验中,我们将在Windows 操作系统下使用Superscan进行网络端口扫描实验,通过端口扫描实验,可以增强学生在网络安全方面的防护意识。

利用综合扫描软件“流光”扫描系统的漏洞并给出安全性评估报告。

二、实验原理(一).端口扫描的原理一个开放的网络端口就是一条与计算机进行通信的信道,对网络端口的扫描可以得到目标计算机开放的服务程序、运行的系统版本信息,从而为下一步的入侵做好准备。

对网络端口的扫描可以通过执行手工命令实现,但效率较低;也可以通过扫描工具实现,效率较高。

扫描工具是对目标主机的安全性弱点进行扫描检测的软件。

它一般具有数据分析功能,通过对端口的扫描分析,可以发现目标主机开放的端口和所提供的服务以及相应服务软件版本和这些服务及软件的安全漏洞,从而能及时了解目标主机存在的安全隐患。

1.端口的基础知识端口是TCP协议中所定义的,TCP协议通过套接字(socket)建立起两台计算机之间的网络连接。

TCP/UDP的端口号在0~65535范围之内,其中1024以下的端口保留给常用的网络服务。

例如,21端口为FTP服务,23端口为TELNET服务,25端口为SMTP服务,80端口为HTTP服务,110端口为POP3服务等。

2.扫描的原理扫描的方式有多种,为了理解扫描原理,需要对TCP协议简要介绍一下。

一个TCP头的数据包格式如图2-1所示。

它包括6个标志位,其中:图2-1 TCP数据包格式扫描往往是入侵的前奏,所以如何有效的屏蔽计算机的端口,保护自身计算机的安全,成为计算机管理人员首要考虑的问题。

为了防止对计算机网络端口的扫描,我们可以采用端口扫描监测工具来监测对端口的扫描,防止端口信息外露。

常用的端口扫描监测工具包括ProtectX、PortSentry等。

udp端口扫描报告资料

udp端口扫描报告资料

《网络协议分析》利用UDP进行主机端口扫描专业:班级:姓名:学号:日期:目录1. 任务题目及要求 (1)1.1 任务简介 (1)1.2 任务要求 (1)2. 课题成员及分工 (1)3. 相关知识简介 (2)3.1 课题的背景及意义 (2)3.2 关键技术 (2)3.3 关键API函数 (3)3.3.1. WSAStarup函数 (3)3.3.2. WSACleanup函数 (3)3.3.3. socket函数 (3)3.3.4. closesocket函数 (4)3.3.5. sendto函数 (4)3.3.6. recvfrom函数 (4)3.3.7. bind函数 (4)4. 系统设计 (6)4.1 主要目标 (6)4.2 开发环境及工具 (6)4.3 功能模块与系统结构 (6)5. UDP扫描的实现 (8)5. 1 基本原理 (8)5.2 计算效验和 (9)5.3 发送UDP数据包 (9)5.4 接收ICMP数据包 (10)6. UDP扫描检测 (13)7. 心得体会 (14)参考文献 (15)1. 任务题目及要求1.1 任务简介UDP是TCP/IP协议族伟传输层设计的两个协议之一,它在进程与进程的通信过程中,提供了有限的差错校验功能,是一种无连接的,不可靠的协议。

UDP 在一个较低的水平上完成进程之间的通信,在收到分组的时候没有流量控制机制也没有确认机制,适用于可靠性比较高的局域网。

由于UDP采用无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。

本次课程设计的目的主要是了解UDP协议的网络传输过程中的一些原理。

1.2 任务要求编写一个简单的主机端口扫描程序,要求能够探测目的主机的端口状态。

具体要求:(1)要求用户可以在参数中输入需要扫描的目的主机的IP地址与端口,输出端口的状态信息。

(2)要求使用UDP协议进行端口的扫描过程。

(3)有良好的编程规范与注释信息。

2. 课题成员及分工本课题组员:周均负责全部工作。

网络报告实验二端口扫描实验superscan

网络报告实验二端口扫描实验superscan

运城学院实验报告专业:网络工程专业系(班):计算机科学与技术系1404班姓名:课程名称:网络安全实用技术实验项目:网络端口扫描实验superscan实验类型:设计型指导老师:杨战武实验地点:网络实验室(2506)时间:2017年 5月10日一、实验目的熟悉并掌握端口扫描工具——Superscan的使用,利用端口扫描工具Superscan对局域网中的机器实施端口扫描,获取网络中各台计算机的端口开放情况,由此来判断网络中的计算机的基本安全情况。

二、实验原理[端口扫描原理]1.端口扫描向目标主机的TCP/IP服务端口发送探测数据包,并记录目标主机的响应。

通过分析响应来判断服务端口是打开还是关闭,就可以得知端口提供的服务或信息。

2.端口扫描主要有经典的扫描器(全连接)、SYN(半连接)扫描器、秘密扫描等。

3.全连接扫描:扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接。

建立连接成功则响应扫描主机的SYN/ACK连接请求,这一响应表明目标端口处于监听(打开)的状态。

如果目标端口处于关闭状态,则目标主机会向扫描主机发送RST的响应。

4.半连接(SYN)扫描:若端口扫描没有完成一个完整的TCP连接,在扫描主机和目标主机的一指定端口建立连接时候只完成了前两次握手,在第三步时,扫描主机中断了本次连接,使连接没有完全建立起来,这样的端口扫描称为半连接扫描,也称为间接扫描。

5.TCP FIN(秘密)扫描:扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。

另一方面,打开的端口会忽略对FIN数据包的回复。

[综合扫描和安全评估技术工作原理]6.获得主机系统在网络服务、版本信息、Web应用等相关信息,然后采用模拟攻击的方法,对目标主机系统进行攻击性的安全漏洞扫描,如果模拟攻击成功,则视为漏洞存在。

最后根据检测结果向系统管理员提供周密可靠的安全性分析报告。

[常见的TCP端口如下]:服务名称端口号说明FTP 21 文件传输服务TELNET 23 远程登录服务HTTP 80 网页浏览服务POP3 110 邮件服务SMTP 25 简单邮件传输服务SOCKS 1080 代理服务[常见的UDP端口如下]服务名称端口号说明RPC 111 远程调用SNMP 161 简单网络管理TFTP 69 简单文件传输DNS 53 域名解析服务[常见端口的关闭方法]:1、关闭7.9等端口:关闭Simple TCP/IP Service,支持以下TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。

实验六 端口扫描实验

实验六 端口扫描实验

实验六端口扫描实验
1 实验类型
验证型实验
2实验目的
●了解端口扫描的基本概念和工作原理;
3背景知识
●端口扫描原理
在“计算机网络”课程中,我们知道完成一次TCP连接需要完成三次握手才能建立。

端口扫描正是利用了这个原理,通过假冒正常的连接过程,依次向目标主机的各个端口发送连接请求,并根据目标主机的应答情况判断目标主机端口的开放情况,从而分析并对一些重要端口实施攻击。

客户端服务端
完整扫描连接过程示意图
另一种扫描方式称为半开扫描,出于欺骗的目的,半开扫描在收到服务端的应答信号(SYN+ACK)后,不再发送响应信号(ACK)。

一次连接过程如下图所示:
客户端服务端
半开扫描连接过程示意图
4 实验内容
1、编写一个利用全连接的端口扫描程序,能显示目标主机的端口开放情况。

要求能在命令行输入要扫描的目标主机和端口范围。

比如:scan *.*.*.* nnnn-mmmm。

5 实验思考
1、阐述全连接扫描的原理。

2、你的程序是否考虑了扫描效率?如没有考虑你准备如何改进?。

实验二 网络端口扫描

实验二 网络端口扫描

实验二网络端口扫描一、实验目的通过练习使用网络端口扫描器,了解目标主机开放的端口和服务程序,从而获得系统有用的信息,发现网络系统的安全漏洞。

本实验将在Windows操作系统下使用Superscan工具进行网络端口扫描实验,在Linux操作系统下将使用综合性扫描工具Nessus进行扫描练习(暂不进行)。

通过端口扫描实验,可以增强学生在网络安全方面的防护意识。

二、实验原理在Internet安全领域,扫描器是最有效的破解工具之一,扫描器是一种自动检测远程或本地主机安全性弱点的程序。

通过使用扫描器,可以发现远程服务器是否存活、它对外开放的各种TCP端口的分配及提供的服务、它所使用的软件版本(如OS和其它Software的版本)以及所存在可能被利用的系统漏洞。

根据这些信息,可以让使用它的用户了解到远程主机所存在的安全问题。

1、扫描的类型(1)地址扫描地址扫描是最简单、最常见的一种扫描方式。

可以通过Ping来判断某一主机是否在线。

也可以通过一些工具来获得某一网络中所有在线主机的地址。

但由于现在很多的路由器与防火墙对ICMP请求进行拦截,因此这种方式也不一定很可靠。

(2)端口扫描互联网上通信的双方不仅需要知道对方的地址,还需要知道通信程序的端口号。

目前使用的IPv4协议支持16位的端号,端口号可使用的范围为0~65535,其中0~1023为熟知端口,被指定给特定的服务使用,由IANA(Internet Assigned Numbers Authority,互联网数字分配机构)管理;1024~49151为注册端口,这些端口由IANA记录并追踪;49152~65535端口叫做动态端口或专门端口,提供给专用应用程序。

在进行入侵攻击之前,首先要了解目标系统的是什么OS,是否有保护措施,运行什么服务和服务的版本,存在漏洞等,而要判断服务的方法就通过端口扫描,这是因为常用的服务是使用标准的端口,因此只要知道了端口号,就能知道目标主机上运行着什么服务,然后才能针对这些服务进行攻击。

实验三 网络服务和端口的扫描

实验三 网络服务和端口的扫描


(1)全TCP扫描 这种扫描方法使用三次握手,与目标主 机建立标准的TCP连接 攻击者首先向目的端口发送一个SYN数据 包,如果收到来自该端口的SYN/ACK数 据包,就可以断定该端口是开放的;然 后攻击者再发送一个ACK数据包


(2)半打开式扫描(SYN)扫描 ①当端口开放时,目标计算机回应SYN/ACK数 据包,这时扫描主机接着发送一个RST=1的数 据包给目标主机,RST数据包将对TCP连接进 行重置,目标计算机因为没有接到相应ACK数 据包,从而不会建立三次握手 ②如果端口是关闭的,则按照TCP协议中端口 未开规则处理,由目标主机发送RST/ACK数据 包给扫描主机,此时TCP连接依然没有建立

-oN
把扫描结果重定向到一个可读的文件 logfilename中。

-p
这个选项让你选择要进行扫描的端口号的范 围。 例如,-p 23表示:只扫描目标主机的23号 端口。 -p 20-30,139,60000-表示:扫描20到30号 端口,139号端口以及所有大于60000的端口。 在默认情况下,nmap扫描从1到1024号以及 nmap-services文件(如果使用RPM软件包,一 般在/usr/share/nmap/目录中)中定义的端口列 表
工具二 Nmap

Nmap是一款基于命令行的端口扫描工具 设计目标:扫描大规模网络可以判断那 些存活主机及其所提供的TCP\UDP网络 服务

Nmap命令格式一般为: Nmap [Scan Type(s)] [Options] <host> 如:扫描一个IP地址为192.168.1.250 Nmap –sP –IP192.168.1.250

端口扫描程序设计(详细的报告+源代码)

端口扫描程序设计(详细的报告+源代码)

收集综合实验之杨若古兰创作任务书一、目的与请求1.性质:设计性实验.2.任务:设计并实现一个端口扫描程序,检测某个IP 或某段IP的计算机的端口工作情况.3.目的:加深对课堂讲授常识的理解,熟练把握基本的收集编程技术和方法,建立收集编程全体概念,使得先生初步具有研讨、设计、编制和调试收集程序的能力.4.请求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完好的源程序,基本功能完美,方便易用,操纵无误.5.先生请求人数:1人.二、次要内容1.编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作.基本工作过程如下:(1) 设定好必定的端口扫描范围;(2) 设定每个端口扫描的次数,由于有可能有的端口一次扫描可能欠亨;(3) 创建socket,通过socket的connect方法来连接近程IP地址和对应的端口;(4) 如果返回false,暗示端口没有开放,否则端口开放.三、进度计划四、设计成果请求1.完成规定的实验任务,保质保量;2.完成综合实验陈述,请求格式规范,内容具体而翔实,应体现本身所做的工作,重视对实验思路的归纳和对成绩解决过程的总结.五、考核方式1.平时成绩+验收答辩+实验陈述;2.五级分制.先生姓名:指点教师:2009 年 6月8 日一、综合实验的目的与请求1.目的:加深对课堂讲授常识的理解,熟练把握基本的收集编程技术和方法,建立收集编程全体概念,加深对JAVA 编程说话的使用,促进编程能力的提高,同时为收集编程打下一个比较好的基础.同时对实验的过程要有完好的了解.2.请求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完好的源程序,基本功能完美,方便易用,操纵无误.二、综合实验注释1.编程说话的选择针对编写的是端口扫描的程序,所以我选择了JAVA编程,由于要简单而方便的试验端口扫描的功能.2.端口扫描实现的功能是:显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作2.1 如何选择IP段和端口创建socket,通过socket的connect方法来连接近程IP地址和对应的端口.而我使用的是socket函数来实现端口的扫描和IP地址的选择扫描.2.2 如何实现快速扫描端口通过实现多线程,当一个IP或者一个端口同时分配多个线程进行扫描,速度会比单线程扫描快很多.2.3 显示扫描结果可以在使用JAVA编写的时候,可以通过使用JScrollPane控件实现显示结果.2.4 实现请求功能之余美化外观3.创建利用程序界面3.1 建立主窗体,“JAVA端口扫描器”图1-13.2 IP地址的输入部分图1-23.3 端口部分,其中包含指定的端口和指定扫描的端口范围图1-33.4 多线程的实现和延时的控制部分图1-43.5 添加的保管及快捷键功能图1-54.扫描的全部过程4.1 填写IP地址—4.2 填写端口扫描的范围为1—3004.3 线程数选择为1004.4 扫描结果如下图1-6三.端口扫描的次要部分程序如下import .*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;/**实现扫描的主体程序*/public class ThreadScan{public static JFrame main=new JFrame("JAVA端口扫描器");//显示扫描结果public static JTextArea Result=new JTextArea("",4,40);//滚动条面板publicstaticJScrollPaneresultPane=newJScrollPane(Result,JScrollPane.V ERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZO NTAL_SCROLLBAR_AS_NEEDED;//输入主机名文本框public static JTextField hostname=new JTextField("localhost",8);//输入ip地址前3位的输入框public static JTextField fromip1=new JTextField("0",3);//输入ip地址4~6位的输入框public static JTextField fromip2=new JTextField("0",3);//输入ip地址7~9位的输入框public static JTextField fromip3=new JTextField("0",3);//输入起始ip地址最初4位的输入框public static JTextField fromip4=new JTextField("0",3);//输入目标ip地址最初4位的输入框public static JTextField toip=new JTextField("0",3);//输入最小端口的输入框public static JTextField minPort=new JTextField("0",4);//输入最大端口的输入框public static JTextField maxPort=new JTextField("1000",4);//输入最大线程数量的输入框public static JTextField maxThread=new JTextField("100",3);//错误提示框public static JDialog DLGError=new JDialog(main,"错误!");public static JLabel DLGINFO=new JLabel("");public static JLabel type=new JLabel("请选择:");//扫描类型public static JRadioButton radioIp = new JRadioButton("IP地址:");public static JRadioButton radioHost = new JRadioButton("主机名:",true);//单选框组public static ButtonGroup group = new ButtonGroup();public static JLabel P1=new JLabel("端口范围:");public static JLabel P2=new JLabel("~");public static JLabel P3=new JLabel("~");public static JLabel Pdot1 = new JLabel(".");public static JLabel Pdot2 = new JLabel(".");public static JLabel Pdot3 = new JLabel(".");public static JLabel TNUM=new JLabel("线程数:");public static JLabel RST=new JLabel("扫描结果: ");public static JLabel con=new JLabel(" ");//定义按钮public static JButton OK = new JButton("确定");public static JButton Submit = new JButton("开始扫描");public static JButton Cancel = new JButton("退出");public static JButton saveButton = new JButton("保管扫描结果");//菜单栏public static JMenuBar myBar = new JMenuBar();public static JMenu myMenu = new JMenu("文件(F)");public static JMenuItem saveItem = new JMenuItem("保管扫描结果(S)");public static JMenuItem exitItem = new JMenuItem("退出(Q)");public static void main(String[] args){main.setSize(500,400);main.setLocation(300,300);main.setResizable(false);main.setLayout(new GridBagLayout());main.setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE);DLGError.setSize(300,100);DLGError.setLocation(400,400);//添加“菜单栏”myMenu.add(saveItem);myMenu.add(exitItem);myBar.add(myMenu);main.setJMenuBar(myBar);//设置热键myMenu.setMnemonic('F');saveItem.setMnemonic ('S');//为“另存为”组件设置快捷键为ctrl+s (KeyEvent.VK_S,InputEvent.CTRL_MASK));exitItem.setMnemonic('Q');(KeyEvent.VK_E,InputEvent.CTRL_MASK));//采取表格包型规划Container mPanel = main.getContentPane(); GridBagConstraints c = new GridBagConstraints();c.insets = new Insets(10,0,0,10);c.gridx = 0;c.gridy = 0;c.gridwidth = 10;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(type,c);group.add(radioIp);group.add(radioHost);c.gridx = 0;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(radioIp,c);c.gridx = 1;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip1,c);c.gridx = 2;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot1,c);c.gridx = 3;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip2,c);c.gridx = 4;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot2,c);c.gridx = 5;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip3,c);c.gridx = 6;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot3,c);c.gridx = 7;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip4,c);c.gridx = 8;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(P2,c);c.gridx = 9;c.gridy = 1;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(toip,c);c.gridx = 0;c.gridy = 2;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(radioHost,c);c.gridx = 1;c.gridy = 2;c.gridwidth = 3;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(hostname,c);c.gridx = 0;c.gridy = 3;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(P1,c);c.gridx = 1;c.gridy = 3;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(minPort,c);c.gridx = 2;c.gridy = 3;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(P3,c);c.gridx = 3;c.gridy = 3;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(maxPort,c);c.gridx = 0;c.gridy = 4;c.gridwidth = 1;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(TNUM,c);c.gridx = 1;c.gridy = 4;c.gridwidth = 3;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER; mPanel.add(maxThread,c);c.gridx = 0;c.gridy = 5;c.gridwidth = 3;c.fill = GridBagConstraints.VERTICAL;c.anchor = GridBagConstraints.CENTER;mPanel.add(Submit,c);c.gridx = 6;c.gridy = 5;c.gridwidth = 4;c.fill = GridBagConstraints.VERTICAL;c.anchor = GridBagConstraints.CENTER;mPanel.add(Cancel,c);c.gridx = 0;c.gridy = 6;c.gridwidth = 10;c.fill = GridBagConstraints.BOTH;c.anchor = GridBagConstraints.CENTER;mPanel.add(RST,c);//设置文本区域可以换行Result.setLineWrap(true);//设置文本区域不成编辑Result.setEditable(false);c.gridx = 0;c.gridy = 7;c.gridwidth = 10;c.gridheight = 4;c.fill = GridBagConstraints.VERTICAL;c.anchor = GridBagConstraints.CENTER;mPanel.add(resultPane,c);Container dPanel = DLGError.getContentPane();dPanel.setLayout(newFlowLayout(FlowLayout.CENTER));dPanel.add(DLGINFO);dPanel.add(OK);Submit.addActionListener(new SubmitAction());Cancel.addActionListener(new CancleAction());OK.addActionListener(new OKAction());//实现退出功能exitItem.addActionListener(newjava.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent e) {System.exit(0);}});//实现帮忙功能saveButton.addActionListener(newjava.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent e) {JFileChooser fc=new JFileChooser();int returnVal=fc.showSaveDialog(null);//点击“保管”if(returnVal == 0){File saveFile=fc.getSelectedFile();try {FileWriter writeOut = new FileWriter(saveFile);writeOut.write(ThreadScan.Result.getText());writeOut.close();}catch (IOException ex) {System.out.println("保管失败");}}//点击“取消”elsereturn;}});main.setVisible(true);}}/**实现“取消”功能*退出程序*/class CancleAction implements ActionListener{ public void actionPerformed (ActionEvent e){ System.exit(0);}}/**实现“确定”功能*完成扫描*/class SubmitAction implements ActionListener{ public void actionPerformed (ActionEvent a){ int minPort;int maxPort;int maxThread;int ip1 = 0;int ip2 = 0;int ip3 = 0;int ipstart = 0;int ipend = 0;String ipaddress = "";String hostname = "";ThreadScan.Result.setText("");//将"确定"按钮设置成为不成用if(ThreadScan.Submit.isEnabled()){ThreadScan.Submit.setEnabled(false);}/**判断搜索的类型*按照ip地址扫描:type = 0*按照主机名称扫描:type = 1*/if(ThreadScan.radioIp.isSelected()){TCPThread.type = 0;//判断ip的前3位是否为int型try{ip1=Integer.parseInt(ThreadScan.fromip1.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的ip!");ThreadScan.DLGError.setVisible(true);return;}//判断ip的4~6位是否为int型try{ip2=Integer.parseInt(ThreadScan.fromip2.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的ip!");ThreadScan.DLGError.setVisible(true);}//判断ip的7~9位是否为int型try{ip3=Integer.parseInt(ThreadScan.fromip3.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的ip!");ThreadScan.DLGError.setVisible(true);return;}//判断起始ip的最初4位是否为int型try{ipstart=Integer.parseInt(ThreadScan.fromip4.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的ip!");ThreadScan.DLGError.setVisible(true);return;}//判断目标ip的最初4位是否为int型try{ipend=Integer.parseInt(ThreadScan.toip.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的目标ip!");ThreadScan.DLGError.setVisible(true);}//判断起始ip是否准确//判断条件:大于0且小于等于255if(ip1<0 || ip1>255||ip2<0 || ip2>255||ip3<0 || ip3>255||ipstart<0 || ipstart>255){ThreadScan.DLGINFO.setText(" ip地址为0-255的整数! ");ThreadScan.DLGError.setVisible(true);return;}else{TCPThread.ip1 = ip1;TCPThread.ip2 = ip2;TCPThread.ip3 = ip3;TCPThread.ipstart = ipstart;}//判断目标ip是否准确//判断条件:大于0且小于等于255if(ipend<0 || ipend>255){FO.setText("目标ip地址为0-255的整数! ");ThreadScan.DLGError.setVisible(true);return;}else{TCPThread.ipend = ipend;}ipaddress = "" + ip1 + ip2 + ip3 + ipstart;/**判断ip地址的无效性*/try{TCPThread.hostAddress=InetAddress.getByName(ipaddress);}catch(UnknownHostException e){ThreadScan.DLGINFO.setText(" 错误的IP 或地址不成达! ");ThreadScan.DLGError.setVisible(true);return;}}//根据主机名进行端口扫描if(ThreadScan.radioHost.isSelected()){TCPThread.type = 1;/**判断主机名称的无效性*/try{TCPThread.hostAddress=InetAddress.getByName(ThreadScan. hostname.getText());}catch(UnknownHostException e){ThreadScan.DLGINFO.setText("错误的域名或地址不成达! ");ThreadScan.DLGError.setVisible(true);return;}}/**判断端口号的无效性*/try{minPort=Integer.parseInt(ThreadScan.minPort.getText());maxPort=Integer.parseInt(ThreadScan.maxPort.getText());maxThread=Integer.parseInt(ThreadScan.maxThread.getText());}catch(NumberFormatException e){ThreadScan.DLGINFO.setText("错误的端口号或线程数!端口号和线程数必须为整数!");ThreadScan.DLGError.setVisible(true);return;}/**判断最小端口号的无效范围*判断条件:大于0且小于65535,最大端口应大于最小端口*/if(minPort<0 || minPort>65535 || minPort>maxPort){ThreadScan.DLGINFO.setText("最小端口必须是0-65535而且小于最大端口的整数!");ThreadScan.DLGError.setVisible(true);return;}else{TCPThread.MIN_port=minPort;}/**判断最大端口号的无效范围*判断条件:大于0且小于65535,最大端口应大于最小端口*/if(maxPort<0 || maxPort>65535 || maxPort<minPort){ThreadScan.DLGINFO.setText("最大端口必须是0-65535而且大于最小端口的整数!");ThreadScan.DLGError.setVisible(true);return;}else{TCPThread.MAX_port=maxPort;}/**判断线程数量的无效范围*判断条件:大于1且小于200*/if(maxThread<1 || maxThread>200){FO.setText("线程数为1-200的整数! ");ThreadScan.DLGError.setVisible(true);return;}ThreadScan.Result.append("线程数"+ThreadScan.maxThread.getText()+"\n");//启动线程for(int i=0;i<maxThread;i++){new TCPThread("T" + i,i).start();}}}/**实现错误提示框中的“确定”按钮功能*/class OKAction implements ActionListener{ public void actionPerformed (ActionEvent e){ ThreadScan.DLGError.dispose();}}多线程类文件:import .*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class TCPThread extends Thread{public static InetAddress hostAddress;//最小的端口号public static int MIN_port;//最大的端口号public static int MAX_port;//线程总数private int threadnum;//查询方式:0为ip;1为主机名public static int type;//ip地址前3位public static int ip1;//ip地址4~6位public static int ip2;//ip地址7~9位public static int ip3;//起始ip地址的最初4位public static int ipstart;//结束ip地址的最初4位public static int ipend;//完好的ip地址public static String ipAll;//扫描的主机名称或ipString hostname = "";//端口的类别String porttype = "0";/**构造函数*/public TCPThread(String name,int threadnum){super(name);this.threadnum = threadnum;}/**运转函数*/public void run() {//ip地址int h = 0;//端口号int i = 0;Socket theTCPsocket;//根据ip地址进行扫描if(type == 0){//ip地址轮回扫描for(h = ipstart; h <=ipend; h++){//构成完好的ip地址ipAll = "" + ip1 + "." + ip2 + "." + ip3 + "." + h;hostname = ipAll;try{//在给定主机名的情况下确定主机的 IP 地址hostAddress=InetAddress.getByName(ipAll);}catch(UnknownHostException e){}//分歧的端口轮回扫描for (i = MIN_port+threadnum; i < MAX_port + Integer.parseInt(ThreadScan.maxThread.getText()); i += Integer.parseInt(ThreadScan.maxThread.getText())){try{theTCPsocket=newSocket(hostAddress,i);theTCPsocket.close();ThreadScan.Result.append(hostname+":"+i);//判断端口的类别switch(i){case 21:porttype = "(FTP)";break;case 23:porttype = "(TELNET)";break;case 25:porttype = "(SMTP)";break;case 80:porttype = "(HTTP)";break;case 110:porttype = "(POP)";break;case 139:porttype = "(netBIOS)";break;case 1433:porttype = "(SQL Server)";break;case 3389:porttype = "(Terminal Service)";break;case 443:porttype = "(HTTPS)";break;case 1521:porttype = "(Oracle)";break;}//端口没有特定类别if(porttype.equals("0")){ ThreadScan.Result.append("\n");}else{ThreadScan.Result.append(":"+porttype+"\n");}}catch (IOException e){}}}//扫描完成后,显示扫描完成,并将“确定”按钮设置为可用if(i==MAX_port+Integer.parseInt(ThreadScan.maxThread.getText())){ThreadScan.Result.append("\n"+"扫描完成...");//将"确定"按钮设置成为可用if(!ThreadScan.Submit.isEnabled()){ThreadScan.Submit.setEnabled(true);}}}//按照主机名进行端口扫描if(type == 1){for (i = MIN_port+threadnum; i < MAX_port+Integer.parseInt(ThreadScan.maxThread.getText()); i += Integer.parseInt(ThreadScan.maxThread.getText())){try{theTCPsocket=newSocket(hostAddress,i);theTCPsocket.close();ThreadScan.Result.append(" "+i);switch(i){case 21:porttype = "(FTP)";break;case 23:porttype = "(TELNET)";break;case 25:porttype = "(SMTP)";break;case 80:porttype = "(HTTP)";break;case 110:porttype = "(POP)";break;case 139:porttype = "(netBIOS)";break;case 1433:porttype = "(SQL Server)";break;case 3389:porttype = "(Terminal Service)";break;case 443:porttype = "(HTTPS)";break;case 1521:porttype = "(Oracle)";break;}//端口没有特定类别if(porttype.equals("0")){ ThreadScan.Result.append("\n");}else{ThreadScan.Result.append(":"+porttype+"\n");}}catch (IOException e){}}//扫描完成后,显示扫描完成,并将【确定】按钮设置为可用if(i==MAX_port+Integer.parseInt(ThreadScan.maxThread.getText())){ThreadScan.Result.append("\n"+"扫描完成...");//将【确定】按钮设置成为可用if(!ThreadScan.Submit.isEnabled()){ThreadScan.Submit.setEnabled(true);}}}}}四、综合实验总结或结论1.通过本次实验,我对于JAVA编程又有了一个新的认识2.了解了IP地址扫描和端口扫描的道理.3.通过解决编程碰到的成绩,提高编程水平,积累经验.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1 需求分析 (3)1.1 课程设计目的 (3)1.2 课程设计容 (3)1.3 课程设计要求 (3)2 概要设计 (3)2.1 原理概述 (3)2.2 运行环境 (3)2.3 基本设计思路 (3)2.4 功能模块设计 (3)3 详细设计 (3)3.1 程序流程 (3)3.2 主要算法 (5)3.3 主要数据结构 (6)3.4 主要函数说明 (6)4 用户使用手册 (7)5 项目分析与总结 (7)5.1 项目分析 (7)5.2 总结与建议 (8)附录A 源程序代码文件说明 (8)附录B 参考文献 (20)1.需求分析1.1 课程设计目的加深对TCP/IP的理解,熟悉socket编程。

课程设计容实现一个扫描器,使用TCP connect进行端口扫描,并把扫描到的结果记录下来。

课程设计要求(1)Windows或Linux环境下,程序在单机上运行;(2)使用端口扫描对一台主机进行扫描,并显示出结果;对一个网段进行IP扫描,显示出结果;(3)提供友好的用户界面。

2.概要设计2.1 原理概述TCP connect扫描是最基本的扫描,操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。

如果端口处于侦听状态,那么connect()就能成功。

否则,这个端口是不能用的,即没有提供服务。

2.2 运行环境Windows xp,VC++6.02.3 基本设计思路创建一个CSocket套接字,通过CSocket的Connect函数测试该主机的某个端口是否能够连通,获得该端口的打开状态。

2.4 功能模块设计(1)测试主机某个端口是否打开;(2)“扫描结果”标题栏;(3)扫描单个或多个端口的单选按钮;(4)“扫描”,“停止”,“保存”按钮。

3.详细设计3.1 程序流程3.2 主要算法(1)测试主机某个端口是否打开的函数TestConnection():BOOL CMyDlg::TestConnection(CString IP,UINT nPort){ CSocket* pSocket;pSocket=new CSocket;ASSERT(pSocket);if (!pSocket->Create()){ delete pSocket;pSocket=NULL;return false;}while (!pSocket->Connect(IP,nPort)){ delete pSocket;pSocket=NULL;return false;}pSocket->Close();delete pSocket;return true;}(2)响应单选按钮“扫描单个端口”和“扫描多个端口”的单击消息:void CMyDlg::OnRadio1Single(){ m_bSinglePort=true;m_cSinglePort.EnableWindow();m_cPortFrom.EnableWindow(false);m_cPortTo.EnableWindow(false);m_cBtnStop.EnableWindow(false);}void CMyDlg::OnRadio2Range(){ m_bSinglePort=false;m_cSinglePort.EnableWindow(false);m_cPortFrom.EnableWindow();m_cPortTo.EnableWindow();m_cBtnStop.EnableWindow(false);}(3)显示列表框标题栏的成员函数://增加列表框标题栏的某一列BOOL CMyDlg::AddColumn(LPCTSTR strItem,int nItem,int nSubItem,int nMask,int nFmt){ LV_COLUMN lvc;lvc.mask=nMask;lvc.fmt=nFmt;lvc.pszText=(LPTSTR) strItem;lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25;if(nMask&LVCF_SUBITEM){ if(nSubItem!=-1)lvc.iSubItem=nSubItem;elselvc.iSubItem=nItem;}return m_cResult.InsertColumn(nItem,&lvc);}//在列表框中加一条BOOL CMyDlg::AddItem(int nItem,int nSubItem,LPCTSTR strItem ,int nImageIndex) { LV_ITEM lvItem;lvItem.mask=LVIF_TEXT;lvItem.iItem=nItem;lvItem.iSubItem=nSubItem;lvItem.pszText=(LPTSTR)strItem;if(nImageIndex!=-1){ lvItem.mask|=LVIF_IMAGE;lvItem.iImage|=LVIF_IMAGE;}if(nSubItem==0)return m_cResult.InsertItem(&lvItem);return m_cResult.SetItem(&lvItem);}//加一列标题栏字符void CMyDlg::AddHeader(LPTSTR hdr){ if (m_pColumns)m_pColumns->AddTail(hdr);}//显示列表框标题栏void CMyDlg::ShowHeaders(){ int nIndex=0;POSITION pos=m_pColumns->GetHeadPosition();while(pos){ CString hdr=(CString)m_pColumns->GetNext(pos);AddColumn(hdr,nIndex++);}}(4)“扫描”,“停止”,“保存”按钮,见附录程序。

3.3 主要数据结构及主要函数说明(1)测试主机某个端口是否打开——TestConnection函数;(2)“扫描结果”标题栏成员函数——AddHeader,AddColumn,ShowHeaders;在列表框中添加字符串的函数——AddItem;(3)扫描单个或多个端口的单选按钮——OnRadioSingle()和OnRadioRange();(4)“扫描”,“停止”,“保存”按钮——OnButton1Start(),OnButton2Stop(),OnButton3Save();4.用户使用手册输入要扫描的主机IP地址,选择“扫描单个端口”或“扫描多个端口”,若选择前者,则输入单个端口号;若选择后者,则输入端口围。

再输入扫描次数(默认值为1),单击“扫描”按钮,扫描结果列表框中将会显示所输入端口的扫描结果。

单击“停止”时停在那一刻的状态,并显示已扫描的结果。

单击“保存”时,可将结果保存在文本文件中。

5.项目分析与总结5.1 项目分析扫描单个端口的结果:扫描多个端口:通过观察,主机IP为10.5.104.36的25号端口是打开的。

5.2 总结与建议通过这次实验,加深了对端口的理解,也对socket编程有了进一步的认识。

实验中遇到许多函数和定义需要上网查阅资料,而且调试的过程也比较困难,需要向同学请教。

所以,今后在编程和查阅资料方面的能力有待于进一步去提高。

附录A源程序代码文件说明:(1)端口扫描Dlg.h:#if !defined(AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDE D_)#define AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <io.h>#include <afxsock.h>//扫描结果typedef struct{ int nAttempts;TCHAR IPAddress[16];TCHAR port[5];BOOL bStatus; //1 = open , 0 = close}DATA;/////////////////////////////////////////////////////////////////////////////// CMyDlg dialogclass CMyDlg : public CDialog{// Constructionpublic:CMyDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CMyDlg)enum { IDD = IDD_MY_DIALOG };CProgressCtrl m_cProgress;CListCtrl m_cResult;CIPAddressCtrl m_cIP;CEdit m_cAttempts;CEdit m_cPortTo;CEdit m_cPortFrom;CEdit m_cSinglePort;CButton m_cBtnStop;CButton m_cBtnScan;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMyDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;BOOL T estConnection(CString IP, UINT nPort);//测试主机某个端口是否打开void ShowHeaders(void);//显示列表框标题栏void AddHeader(LPTSTR hdr);//增加一列标题栏字符AddItem(int nItem,int nSubItem,LPCTSTR strItem,int nImageIndex=-1);//向m_cResult输出一个结果// 向输出结构列表控件增加一列BOOL AddColumn(LPCTSTR strItem,int nItem,int nSubItem=-1,int nMask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM,int nFmt=LVCFMT_LEFT);// 变量UINT m_nMaxAttempts; //试图连接次数的最大值BOOL m_bSinglePort; //是否只扫描单个端口UINT m_minPort,m_maxPort; //扫描端口的围UINT m_nCounter; //端口的个数CStringList* m_pColumns; //列表框标题栏CPtrList* m_pStatusList;//保存扫描结果的链表// Generated message map functions//{{AFX_MSG(CMyDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButton1Start();afx_msg void OnButton2Stop();afx_msg void OnButton3Save();afx_msg void OnRadio1Single();afx_msg void OnRadio2Range();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED _)(2)端口扫描Dlg.cpp:#include"stdafx.h"#include"端口扫描.h"#include"端口扫描Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{ public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent)//在对话框的构造函数中初始化成员变量{//{{AFX_DATA_INIT(CMyDlg)//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_pColumns=new CStringList;ASSERT(m_pColumns);m_bSinglePort=true;m_nMaxAttempts=1;m_pStatusList=new CPtrList;ASSERT(m_pStatusList);}void CMyDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)DDX_Control(pDX, IDC_PROGRESS1, m_cProgress);DDX_Control(pDX, IDC_LIST1, m_cResult);DDX_Control(pDX, IDC_IPADDRESS1, m_cIP);DDX_Control(pDX, IDC_EDIT4_ATTEMPTS, m_cAttempts);DDX_Control(pDX, IDC_EDIT3_SINGLE_PORT_TO, m_cPortTo);DDX_Control(pDX, IDC_EDIT2_SINGLE_PORT_FROM, m_cPortFrom);DDX_Control(pDX, IDC_EDIT1_SINGLE_PORT, m_cSinglePort);DDX_Control(pDX, IDC_BUTTON2_STOP, m_cBtnStop);DDX_Control(pDX, IDC_BUTTON1_START, m_cBtnScan);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1_START, OnButton1Start)ON_BN_CLICKED(IDC_BUTTON2_STOP, OnButton2Stop)ON_BN_CLICKED(IDC_BUTTON3_SAVE, OnButton3Save)ON_BN_CLICKED(IDC_RADIO1_SINGLE, OnRadio1Single)ON_BN_CLICKED(IDC_RADIO2_RANGE, OnRadio2Range)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMyDlg message handlersBOOL CMyDlg::OnInitDialog()//设置按钮的初始状态和列表框的风格{CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization here//给列表框加标题栏AddHeader(_T("IP地址")); // 加一列标题栏字符AddHeader(_T("端口号"));AddHeader(_T("端口状态"));AddHeader(_T("尝试连接次数"));AddHeader(_T("标记"));ShowHeaders();//设置扫描单个端口CheckRadioButton(IDC_RADIO1_SINGLE,IDC_RADIO2_RANGE,IDC_RADIO1_SINGLE );//设置控件的默认状态m_cSinglePort.EnableWindow();m_cPortFrom.EnableWindow(false);m_cPortTo.EnableWindow(false);m_cBtnStop.EnableWindow(false);m_cAttempts.SetWindowText(_T("1"));return TRUE; // return TRUE unless you set the focus to a control}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX){ CAboutDlg dlgAbout;dlgAbout.DoModal();}else{ CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CMyDlg::OnQueryDragIcon(){ return (HCURSOR) m_hIcon;}void CMyDlg::OnButton1Start() //“扫描”按钮{ // TODO: Add your control notification handler code here CString btnTxt,IP;UINT nSinglePort;BYTE f1,f2,f3,f4;TCHAR temp[10]="\0";m_cProgress.SetPos(0);m_cResult.DeleteAllItems();POSITION p=m_pStatusList->GetHeadPosition(); while(p){POSITION temp=p;DATA* pNode=(DATA*)m_pStatusList->GetNext(p);m_pStatusList->RemoveAt(temp);if (pNode)//pNode!=nulldelete pNode;}if(m_cIP.IsBlank()){ MessageBox("请输入主机IP地址");return;}if(m_cIP.GetAddress(f1,f2,f3,f4)<4) {MessageBox("请输入有效的IP地址");return;}IP=_itoa(f1,temp,10);IP+=_T('.');IP+=_itoa(f2,temp,10);IP+=_T('.');IP+=_itoa(f3,temp,10);IP+=_T('.');IP+=_itoa(f4,temp,10);m_cBtnStop.EnableWindow();m_cBtnScan.EnableWindow(false);if(m_bSinglePort){ CString port;m_cSinglePort.GetWindowText(port);m_minPort=m_maxPort=nSinglePort=atoi(port);} else{ CString port1,port2;m_cPortFrom.GetWindowText(port1);m_cPortTo.GetWindowText(port2);m_minPort=atoi(port1);m_maxPort=atoi(port2);m_cProgress.SetRange32(0,m_maxPort-m_minPort+1);m_cProgress.SetStep(1);}if (!m_bSinglePort&&m_maxPort<m_minPort){MessageBox(_T("您输入的端口围有误,请重新输入"));return;}UINT m_nMaxAttempts=GetDlgItemInt(IDC_EDIT4_ATTEMPTS);for(m_nCounter=m_minPort;m_nCounter<=m_maxPort;m_nCounter++) {BOOL bIsOpen=false;UINT nAttempt=1;while(nAttempt<=m_nMaxAttempts && !bIsOpen){TCHAR temp[10]="\0";CString str=_T("尝试连接端口:");str+=itoa(m_nCounter,temp,10);str+=_T(", IP地址为=");str+=IP;str+=_T(", 尝试次数为=");str+=itoa(nAttempt,temp,10);CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS);pStatic->SetWindowText(str);str.Empty();bIsOpen=T estConnection(IP,m_nCounter);if(bIsOpen){DATA* pNode=new DATA;ASSERT(pNode);strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));strcpy(pNode->port,_itoa(m_nCounter,temp,10));pNode->bStatus = 1; //openpNode->nAttempts=nAttempt;m_pStatusList->AddTail(pNode);}nAttempt++;}if (!bIsOpen){DATA* pNode=new DATA;ASSERT(pNode);strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));strcpy(pNode->port,_itoa(m_nCounter,temp,10));pNode->bStatus=0; //closepNode->nAttempts=nAttempt-1;m_pStatusList->AddTail(pNode);}MSG message;if (::PeekMessage(&message,NULL,0,0,PM_REMOVE)){::TranslateMessage(&message);::DispatchMessage(&message);}m_cProgress.StepIt();}CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS);pStatic->SetWindowText((CString)_T("当前扫描状态"));m_cBtnScan.EnableWindow();m_cBtnStop.EnableWindow(false);UINT nIndex=0;POSITION pos=m_pStatusList->GetHeadPosition();while(pos){ DATA* pNode=(DATA*)m_pStatusList->GetNext(pos);AddItem(nIndex,0,pNode->IPAddress);AddItem(nIndex,1,pNode->port);if (pNode->bStatus){ AddItem(nIndex,2,_T("Open"));AddItem(nIndex,4,_T("*"));}else{ AddItem(nIndex,2,_T("Close"));AddItem(nIndex,4,_T(" "));}AddItem(nIndex++,3,_itoa(pNode->nAttempts,temp,10));}}void CMyDlg::OnButton2Stop() //“停止”按钮{ // TODO: Add your control notification handler code here m_nCounter=m_maxPort+1;m_cBtnStop.EnableWindow(false);m_cBtnScan.EnableWindow();CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS);pStatic->SetWindowText((CString)_T("当前扫描状态"));}void CMyDlg::OnButton3Save() //“保存”按钮{// TODO: Add your control notification handler code here CFileDialog* pDlg=new CFileDialog(FALSE,_T("txt"),NULL,OFN_OVERWRITEPROMPT |OFN_EXPLORER | OFN_LONGNAMES,_T("Scanned ports files (*.txt)"),this);ASSERT(pDlg);if (pDlg->DoModal()==IDOK){int nHandle,retVal;nHandle=_open(pDlg->GetPathName(),_O_BINARY|_O_CREAT|_O_TRUNC|_O_ RDWR);if (nHandle==-1){MessageBox(_T("Unable to open output file to write."),_T("Error"),MB_OK|MB_ICONEXCLAMATION);delete pDlg;return;}POSITION pos=m_pStatusList->GetHeadPosition();while(pos){CString buffer;DATA* pNode=(DATA*)m_pStatusList->GetNext(pos);buffer=pNode->IPAddress;buffer+=_T(',');buffer+=pNode->port;buffer+=_T(',');if (pNode->bStatus)buffer+=_T("Open");elsebuffer+=_T("Close");buffer+=_T("\r\n\0");retVal=_write(nHandle,(void*)buffer.GetBuffer(buffer.GetLength()),buffer.GetLength());if (retVal!=buffer.GetLength()){MessageBox(_T("An error occured while writing records."), _T("Error"),MB_OK | MB_ICONEXCLAMATION);delete pDlg;return;}buffer.Empty();}_close(nHandle);}delete pDlg;}void CMyDlg::OnRadio1Single(){// TODO: Add your control notification handler code here m_bSinglePort=true;m_cSinglePort.EnableWindow();m_cPortFrom.EnableWindow(false);m_cPortTo.EnableWindow(false);m_cBtnStop.EnableWindow(false);}void CMyDlg::OnRadio2Range(){ // TODO: Add your control notification handler code here m_bSinglePort=false;m_cSinglePort.EnableWindow(false);m_cPortFrom.EnableWindow();m_cPortTo.EnableWindow();m_cBtnStop.EnableWindow(false);}//测试主机的某个端口是否打开BOOL CMyDlg::TestConnection(CString IP,UINT nPort){ CSocket* pSocket;pSocket=new CSocket;ASSERT(pSocket);if (!pSocket->Create()){delete pSocket;pSocket=NULL;return false;}while (!pSocket->Connect(IP,nPort)){delete pSocket;pSocket=NULL;return false;}pSocket->Close();delete pSocket;return true;}//增加列表框标题栏的某一列BOOL CMyDlg::AddColumn(LPCTSTR strItem,int nItem,int nSubItem,int nMask,int nFmt){ LV_COLUMN lvc;lvc.mask=nMask;lvc.fmt=nFmt;lvc.pszText=(LPTSTR) strItem;lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25;if(nMask&LVCF_SUBITEM){if(nSubItem!=-1)lvc.iSubItem=nSubItem;elselvc.iSubItem=nItem;}return m_cResult.InsertColumn(nItem,&lvc);}//在列表框中加一条BOOL CMyDlg::AddItem(int nItem,int nSubItem,LPCTSTR strItem ,int nImageIndex) {LV_ITEM lvItem;lvItem.mask=LVIF_TEXT;lvItem.iItem=nItem;lvItem.iSubItem=nSubItem;lvItem.pszText=(LPTSTR)strItem;if(nImageIndex!=-1){lvItem.mask|=LVIF_IMAGE;lvItem.iImage|=LVIF_IMAGE;}if(nSubItem==0)return m_cResult.InsertItem(&lvItem);return m_cResult.SetItem(&lvItem);}//加一列标题栏字符void CMyDlg::AddHeader(LPTSTR hdr){if (m_pColumns)m_pColumns->AddTail(hdr);}//显示列表框标题栏void CMyDlg::ShowHeaders(){int nIndex=0;POSITION pos=m_pColumns->GetHeadPosition();while(pos){CString hdr=(CString)m_pColumns->GetNext(pos);AddColumn(hdr,nIndex++);}}附录B参考文献:Visual C++ 实效编程百例(第二版)人民邮电。

相关文档
最新文档