计算机网络课程设计报告端口扫描实验报告.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;//试图连接次数的最