计算机网络课程设计++端口扫描++实验报告.docx
- 文档编号:5660441
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:25
- 大小:89.88KB
计算机网络课程设计++端口扫描++实验报告.docx
《计算机网络课程设计++端口扫描++实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计++端口扫描++实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计++端口扫描++实验报告
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编程。
课程设计内容
实现一个扫描器,使用TCPconnect进行端口扫描,并把扫描到的结果记录下来。
课程设计要求
(1)Windows或Linux环境下,程序在单机上运行;
(2)使用端口扫描对一台主机进行扫描,并显示出结果;对一个网段进行IP扫描,显示出结果;
(3)提供友好的用户界面。
2.概要设计
2.1原理概述
TCPconnect扫描是最基本的扫描,操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态,那么connect()就能成功。
否则,这个端口是不能用的,即没有提供服务。
2.2运行环境
Windowsxp,VC++6.0
2.3基本设计思路
创建一个CSocket套接字,通过CSocket的Connect函数测试该主机的某个端口是否能够连通,获得该端口的打开状态。
2.4功能模块设计
(1)测试主机某个端口是否打开;
(2)“扫描结果”标题栏;
(3)扫描单个或多个端口的单选按钮;
(4)“扫描”,“停止”,“保存”按钮。
3.详细设计
3.1程序流程
3.2主要算法
(1)测试主机某个端口是否打开的函数TestConnection():
BOOLCMyDlg:
:
TestConnection(CStringIP,UINTnPort)
{CSocket*pSocket;
pSocket=newCSocket;
ASSERT(pSocket);
if(!
pSocket->Create())
{deletepSocket;
pSocket=NULL;
returnfalse;
}
while(!
pSocket->Connect(IP,nPort))
{deletepSocket;
pSocket=NULL;
returnfalse;
}
pSocket->Close();
deletepSocket;
returntrue;
}
(2)响应单选按钮“扫描单个端口”和“扫描多个端口”的单击消息:
voidCMyDlg:
:
OnRadio1Single()
{m_bSinglePort=true;
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(false);
m_cPortTo.EnableWindow(false);
m_cBtnStop.EnableWindow(false);
}
voidCMyDlg:
:
OnRadio2Range()
{m_bSinglePort=false;
m_cSinglePort.EnableWindow(false);
m_cPortFrom.EnableWindow();
m_cPortTo.EnableWindow();
m_cBtnStop.EnableWindow(false);
}
(3)显示列表框标题栏的成员函数:
//增加列表框标题栏的某一列
BOOLCMyDlg:
:
AddColumn(LPCTSTRstrItem,intnItem,intnSubItem,intnMask,intnFmt)
{LV_COLUMNlvc;
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;
else
lvc.iSubItem=nItem;
}
returnm_cResult.InsertColumn(nItem,&lvc);
}
//在列表框中加一条
BOOLCMyDlg:
:
AddItem(intnItem,intnSubItem,LPCTSTRstrItem,intnImageIndex)
{LV_ITEMlvItem;
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)
returnm_cResult.InsertItem(&lvItem);
returnm_cResult.SetItem(&lvItem);
}
//加一列标题栏字符
voidCMyDlg:
:
AddHeader(LPTSTRhdr)
{if(m_pColumns)
m_pColumns->AddTail(hdr);
}
//显示列表框标题栏
voidCMyDlg:
:
ShowHeaders()
{intnIndex=0;
POSITIONpos=m_pColumns->GetHeadPosition();
while(pos)
{CStringhdr=(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__INCLUDED_)
#defineAFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include
#include
#include
#include
#include
//扫描结果
typedefstruct
{intnAttempts;
TCHARIPAddress[16];
TCHARport[5];
BOOLbStatus;//1=open,0=close
}DATA;
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
classCMyDlg:
publicCDialog
{//Construction
public:
CMyDlg(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CMyDlg)
enum{IDD=IDD_MY_DIALOG};
CProgressCtrlm_cProgress;
CListCtrlm_cResult;
CIPAddressCtrlm_cIP;
CEditm_cAttempts;
CEditm_cPortTo;
CEditm_cPortFrom;
CEditm_cSinglePort;
CButtonm_cBtnStop;
CButtonm_cBtnScan;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMyDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
BOOLTestConnection(CStringIP,UINTnPort);//测试主机某个端口是否打开
voidShowHeaders(void);//显示列表框标题栏
voidAddHeader(LPTSTRhdr);//增加一列标题栏字符
AddItem(intnItem,intnSubItem,LPCTSTRstrItem,intnImageIndex=-1);//向m_cResult输出一个结果
//向输出结构列表控件增加一列
BOOLAddColumn(LPCTSTRstrItem,intnItem,intnSubItem=-1,
intnMask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM,
intnFmt=LVCFMT_LEFT);
//变量
UINTm_nMaxAttempts;//试图连接次数的最大值
BOOLm_bSinglePort;//是否只扫描单个端口
UINTm_minPort,m_maxPort;//扫描端口的范围
UINTm_nCounter;//端口的个数
CStringList*m_pColumns;//列表框标题栏
CPtrList*m_pStatusList;//保存扫描结果的链表
//Generatedmessagemapfunctions
//{{AFX_MSG(CMyDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnButton1Start();
afx_msgvoidOnButton2Stop();
afx_msgvoidOnButton3Save();
afx_msgvoidOnRadio1Single();
afx_msgvoidOnRadio2Range();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_)
(2)端口扫描Dlg.cpp:
#include"stdafx.h"
#include"端口扫描.h"
#include"端口扫描Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
CMyDlg:
:
CMyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyDlg:
:
IDD,pParent)//在对话框的构造函数中初始化成员变量
{
//{{AFX_DATA_INIT(CMyDlg)
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pColumns=newCStringList;
ASSERT(m_pColumns);
m_bSinglePort=true;
m_nMaxAttempts=1;
m_pStatusList=newCPtrList;
ASSERT(m_pStatusList);
}
voidCMyDlg:
:
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_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgmessagehandlers
BOOLCMyDlg:
:
OnInitDialog()//设置按钮的初始状态和列表框的风格
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//给列表框加标题栏
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"));
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{if((nID&0xFFF0)==IDM_ABOUTBOX)
{CA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 端口扫描 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)