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

合集下载

网络端口扫描

网络端口扫描

电子信息工程学系实验报告 ——适用于计算机课程课程名称:信息安全技术实验项目名称:网络端口扫描 实验时间: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使用小工具实验总结:实验内容全部完成,通过此次实验,我学习到了漏洞扫描、端口扫描等的一些基本知识,并学会了使用一些常用的扫描工具及防护工具。

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

  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++ 实效编程百例(第二版)人民邮电。

相关文档
最新文档