《TCPIP 原理与应用》课程设计.docx
- 文档编号:4817794
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:28
- 大小:216.77KB
《TCPIP 原理与应用》课程设计.docx
《《TCPIP 原理与应用》课程设计.docx》由会员分享,可在线阅读,更多相关《《TCPIP 原理与应用》课程设计.docx(28页珍藏版)》请在冰点文库上搜索。
《TCPIP原理与应用》课程设计
《TCP/IP原理与应用》课程设计
小组成员:
孙振(200800824122)
陈旭(200800824105)
赵云杰(200800824224)
黄晓蕾(200800824207)
指导老师:
夏冰孙飞显
摘要:
计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。
端口扫描技术是发现安全问题的重要手段之一。
本程序是在Windows系统中使用C语言用MFC完成的一个存活主机和端口扫描程序。
存活主机使用的ICMP协议,端口扫描使用了TCPconnect()扫描。
能找出一定IP段存在的主机,能扫描主机特定的部分端口号或对指定的端口段内的端口进行逐个扫描。
关键词:
存活主机ip地址端口扫描
一、设计题目4
1、任务4
2、要求4
二、需求分析4
三、概要设计4
1、设计思想4
2、功能模块4
3、程序执行模块5
四、详细设计6
1、界面的设计6
2、存活主机扫描8
3、端口扫描12
五、调试分析18
1、扫描单一ip地址(以本地计算机为例)18
2、扫描本地计算机所在网段内其他主机情况18
3、扫描本机的端口19
4、扫描主机若干个端口19
5、保存扫描结果20
六、心得体会21
一、设计题目
基于全连接的网络主机端口扫描系统设计与实现*
1、任务
基于全连接的TCP协议,设计、实现并测试扫描远程主机端口开放情况的应用软件。
2、要求
采用多线程、DLL技术对指定的单个IP或IP段(连续或不连续)内存活主机的开放端口进行扫描
扫描结果用树型方法显示,并将主机及其开放的端口信息保存在自己指定的文本文件中
界面要美观、大方
二、需求分析
1、对单个IP地址,对一个IP对进行扫描,查看存活主机。
2、对IP地址进行扫描,查看端口号是否打开。
3、向IP地址发送ICMP包,根据返回的情况判断是否存在主机。
三、概要设计
1、设计思想
扫描IP就是查看存活主机,向所要发送的IP地址发送ICMP包,如果有返回的数据就说明该主机存在,否则不存在。
当扫描IP地址段的时候,向下一个IP地址发送ICMP包即可,依次类推就可以的得到一棵树,来显示存活主机。
扫描整个系统的所有端口,找到自己需要了解的端口的扫描结果。
用户在等待扫描的时候,往往希望知道它的工作进度。
这样用户可以更好地控制自己的操作。
站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。
系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:
IP扫描功能;
地址选择功能;
端口选择功能;
进度显示功能;
2、功能模块
3、程序执行模块
四、详细设计
1、界面的设计
主题界面使用两个界面叠加而成,即存活主机扫描和端口扫描,具体如下图所示:
界面设计以及消息代码如下:
voidCHostScanDlg:
:
initTab()
{
m_CtrlTab.InsertItem(0,_T("存活主机扫描"));
m_CtrlTab.InsertItem(1,_T("端口扫描"));
this->activehostscanDlg.Create(IDD_ACTIVEHOSTSCAN_DIALOG,&(this->m_CtrlTab));
this->protscanDlg.Create(IDD_PORTSCAN_DIALOG,&(this->m_CtrlTab));
CRectrc;
m_CtrlTab.GetClientRect(&rc);
rc.top+=30;
rc.bottom-=10;
rc.left+=10;
rc.right-=10;
activehostscanDlg.MoveWindow(&rc);
protscanDlg.MoveWindow(&rc);
activehostscanDlg.ShowWindow(true);
protscanDlg.ShowWindow(false);
m_CtrlTab.SetCurSel(0);
}
voidCHostScanDlg:
:
OnSelchangeTab(NMHDR*pNMHDR,LRESULT*pResult)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intCurSel=m_CtrlTab.GetCurSel();
switch(CurSel)
{
case0:
activehostscanDlg.ShowWindow(true);
protscanDlg.ShowWindow(false);
break;
case1:
activehostscanDlg.ShowWindow(false);
protscanDlg.ShowWindow(true);
break;
default:
;
}
*pResult=0;
}
2、存活主机扫描
1)所用的主要成员变量
2)设置扫描单个主机或者地址段
voidCActiveHostScan:
:
OnCheckIfsingle()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(!
m_bIfSingle)
{
GetDlgItem(IDC_IPADDRESS_IPSCANEND)->EnableWindow(FALSE);
m_bIfSingle=TRUE;
}
else
{
GetDlgItem(IDC_IPADDRESS_IPSCANEND)->EnableWindow(TRUE);
m_bIfSingle=FALSE;
}
}
3)发送ICMP包以及处理的函数
intCActiveHostScan:
:
ICMP(char*DestIpAddr)
{
WSADATAwsaData;
intResult;
if((Result=WSAStartup(MAKEWORD(2,2),&wsaData))!
=0)
{
printf("WSAStartupfailedwitherror%d\n",Result);
return0;
}
sockaddr_inDestAddr;
SOCKETIcmpSocket;
IcmpSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(IcmpSocket==INVALID_SOCKET)
{
printf("socketfailedwitherror%d\n",WSAGetLastError());
return0;
}
intTimeout=1000;
Result=setsockopt(IcmpSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&Timeout,sizeof(Timeout));
if(Result==SOCKET_ERROR)
{
printf("setsockoptfailedwitherror%d\n",WSAGetLastError());
return0;
}
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_addr.s_addr=inet_addr(DestIpAddr);
DestAddr.sin_port=htons(0);
DestAddr.sin_family=AF_INET;
Icmp_Header*SendIcmp;
sockaddr_inaddr;
charIcmpBuffer[8]="";
SendIcmp=(Icmp_Header*)IcmpBuffer;
SendIcmp->Type=8;
SendIcmp->Code=0;
SendIcmp->ID=(USHORT)GetCurrentProcessId();
SendIcmp->Sequence=htons
(1);
SendIcmp->Checksum=0;
SendIcmp->Checksum=checksum((USHORT*)IcmpBuffer,sizeof(IcmpBuffer));
Result=sendto(IcmpSocket,IcmpBuffer,sizeof(IcmpBuffer),0,(SOCKADDR*)&DestAddr,sizeof(DestAddr));
if(Result==SOCKET_ERROR)
{
printf("sendtofailedwitherror%d\n",WSAGetLastError());
return0;
}
intLen=sizeof(addr);
charRecvBuffer[1024];
Result=recvfrom(IcmpSocket,RecvBuffer,1024,0,(sockaddr*)&addr,&Len);
if(Result==SOCKET_ERROR)
{
if(WSAGetLastError()!
=WSAETIMEDOUT)
{
printf("recvfromfailedwitherror%d\n",WSAGetLastError());
return0;
}
else
{
printf("Host%smaybedown.\n",DestIpAddr);
return-1;
}
}
printf("Host%sisup.\n",DestIpAddr);
if(closesocket(IcmpSocket)==SOCKET_ERROR)
{
printf("closesocketfailedwitherror%d\n",WSAGetLastError());
return0;
}
if(WSACleanup()==SOCKET_ERROR)
{
printf("WSACleanupfailedwitherror%d\n",WSAGetLastError());
return0;
}
return1;
}
USHORTCActiveHostScan:
:
checksum(USHORT*buff,intsize)
{
unsignedlongcksum=0;
while(size>1)
{
cksum+=*buff++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR*)(buff);
}
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return(USHORT)(~cksum);
}
4)扫描函数
voidCActiveHostScan:
:
OnButtonStarscan()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringip_str1,ip_str2;
BYTEipfile1[4],ipfile2[4];
m_treeShow.DeleteAllItems();
charcStmp[50];
m_ip_start.GetAddress(ipfile1[0],ipfile1[1],ipfile1[2],ipfile1[3]);
m_ip_end.GetAddress(ipfile2[0],ipfile2[1],ipfile2[2],ipfile2[3]);
ip_str2.Format("%d.%d.%d.%d",ipfile2[0],ipfile2[1],ipfile2[2],ipfile2[3]);
CStringstrState,str;
if(m_bIfSingle==TRUE)
{
ip_str1.Format("%d.%d.%d.%d",ipfile1[0],ipfile1[1],ipfile1[2],ipfile1[3]);
memcpy(&cStmp,ip_str1,sizeof(cStmp));
SetDlgItemText(IDC_EDIT_IPSCANSTATE,"");
if(ICMP(cStmp)==1)
{
m_treeShow.InsertItem(cStmp);
strState.Format("Ping:
%s...",cStmp);
strState=strState+"Successfully";
SetDlgItemText(IDC_EDIT_IPSCANSTATE,strState);
}
else
{
strState.Format("Ping:
%s...",cStmp);
strState=strState+"Failed";
SetDlgItemText(IDC_EDIT_IPSCANSTATE,strState);
}
}
else{
while(ipfile1[3]<=ipfile2[3])
{
ip_str1.Format("%d.%d.%d.%d",ipfile1[0],ipfile1[1],ipfile1[2],ipfile1[3]);
memcpy(&cStmp,ip_str1,sizeof(cStmp));
GetDlgItemText(IDC_EDIT_IPSCANSTATE,str);
strState.Format("Ping:
%s...",cStmp);
if(ICMP(cStmp)==1)
{
m_treeShow.InsertItem(cStmp);
strState=strState+"Successfully";
}
else
{
strState=strState+"Failed";
}
strState=str+strState+"\r\n";
SetDlgItemText(IDC_EDIT_IPSCANSTATE,strState);
ipfile1[3]++;
}
}
MessageBox("完成!
");
}
3、端口扫描
1)初始化列表框以及界面
BOOLCPortScan:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
bIfBtnFirstCheck=FALSE;
Dport=0;
Dip=0;
SetDlgItemText(IDC_IPADDRESS_PORTSCANEND,"127.0.0.1");
SetDlgItemText(IDC_IPADDRESS_PORTSCANSTART,"127.0.0.1");
AddHeader(_T("IPaddress"));
AddHeader(_T("Portnumber"));
AddHeader(_T("PortStatus"));
ShowHeaders();
GetDlgItem(IDC_BUTTON_PORTSCANSTAR)->EnableWindow();
GetDlgItem(IDC_BUTTON_PORTSCANPOSE)->EnableWindow(FALSE);
returnTRUE;
}
2)设置扫描结果的列表框
//增加列表框标题栏的某一列
BOOLCPortScan:
:
AddColumn(LPCTSTRstrItem,intnItem,intnSubItem,intnMask,intnFmt)
{
LV_COLUMNlvc;
lvc.mask=nMask;
lvc.fmt=nFmt;
lvc.pszText=(LPTSTR)strItem;
lvc.cx=m_CtrlListPort.GetStringWidth(lvc.pszText)+25;
if(nMask&LVCF_SUBITEM)
{
if(nSubItem!
=-1)
lvc.iSubItem=nSubItem;
else
lvc.iSubItem=nItem;
}
returnm_CtrlListPort.InsertColumn(nItem,&lvc);
}
//在列表框中加一条
BOOLCPortScan:
:
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_CtrlListPort.InsertItem(&lvItem);
returnm_CtrlListPort.SetItem(&lvItem);
}
3)扫描端口函数
voidCPortScan:
:
OnButtonPortscanstar()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//清空列表框
m_CtrlListPort.DeleteAllItems();
//清空扫描结果链表
POSITIONp=m_pStatusList->GetHeadPosition();
while(p)
{
POSITIONtemp=p;
DATA*pNode=(DATA*)m_pStatusList->GetNext(p);
//Iftheretrievedelementisthelastinthelist,
//thenthenewvalueofrPositionissettoNULL.
m_pStatusList->RemoveAt(temp);
if(pNode)
deletepNode;
}
//设置按钮状态
GetDlgItem(IDC_BUTTON_PORTSCANSTAR)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_PORTSCANPOSE)->EnableWindow(TRUE);
DWORDstartip=0,endip=0;
DWORDstartport=0,endport=0;
if(!
bIfBtnFirstCheck)
{
this->m_ip_to.GetAddress(endip);
if(m_bIfSingleIP)
{
startip=endip;
}
else
{
m_ip_from.GetAddress(startip);
}
if(startip>endip)
{
GetDlgItem(IDC_BUTTON_PORTSCANSTAR)->EnableWindow(TRUE);
MessageBox("请保证两个IP的大小顺序!
");
return;
}
UpdateData(TRUE);
startport=m_port_from;
endport=m_port_to;
if(m_bIfSinglePort)
{
startport=endport;
}
else
{
startport=m_port_from;
}
if(startport>endport)
{
GetDlgItem(IDC_BUTTON_PORTSCANSTAR)->EnableWindow(TRUE);
MessageBox("请保证两个端口的大小顺序!
");
return;
}
}
else
{
Dport=startport;
Dip=startip;
}
CStringIP;
in_addripa;
for(DWORDj=startip;j<=endip;j++)
{
Dip=j;
for(DWORDi=startport;i<=endport;i++)
{
Dport=i;
UINTnAttempt=0;
BOOLbIsOpen=FALSE;
ipa.s_addr=htonl(j);
IP=inet_ntoa(ipa);
CStringstr;
str.Format("Tryingport:
%d,IPAddress:
%s...",i,IP);
CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_PORTSTATE);
pStatic->SetWindowText(str);
str.Empty();
bIsOpen=TestConnection(IP,i);
DATA*pNode=newDATA;
ASSERT(pNode);
strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));
pNode->port=i;
pNode->nAttempts=n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCPIP 原理与应用 TCPIP 原理与应用课程设计 TCPIP 原理 应用 课程设计