




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告课程名称 网络通信程序设计实验仪器 计算机 实验名称 路由跟踪 系别—计算机学院.专业班级/学号___学生姓名 实验日期 2014年4月6日成绩 指导教师 焦健实验二路由跟踪实验一、实验目的学习分析程序功能结构。熟悉ICMP协议的工作原理和路由跟踪的原理。掌握VC6.0下程序调试、运行的基本方法。二、实验原理路由跟踪的实现就是巧妙地利用了ICMP报文的TTL超时报文。其实现过程如下:源主机先向目的主机发送一个回应请求报文(类型8),TTL值设为1,第一个路由器收到后将TTL减1,这样TTL变为0,分组被废除。同时路由器向源主机发送一个TTL超时报文(类型为11),报文的IP包头中的源IP地址就是第一个路由器的地址,源主机就可以通过对该报文进行分析,得到第一个路由器的地址。接着发送TTL等于2的报文得到第二个路由器地址,再发TTL等于3的报文。如此下去直到收到目的主机的回应应答报文(类型为0)或目的不可达报文(类型为3),或者到了最大跳数(要检测路由器个数的最大值)。可以看到,对TTL的设置是实现跟踪的关键,使用函数setsockopt(m_Sock,IPPROTO_IP,IP_TTL,(LPSTR)&TTL,sizeof(int))可以对其进行设置,m_Sock是所创建的套接字,IP_TTL说明是进行TTL设置,TTL即是要设置的TTL值,为一个整形数值。其实现流程如图1所示图1路由跟踪流程图三、实验内容1、按照附录内容给RouteTrace程序添加代码,增加注释,调试程序通过。源代码:RouteTrace・cpp//RouteTrace.cpp:Definestheclassbehaviorsfortheapplication.#include"stdafx.h"#include"RouteTrace.h"#include"RouteTraceDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CRouteTraceAppBEGIN_MESSAGE_MAP(CRouteTraceApp,CWinApp)//{{AFX_MSG_MAP(CRouteTraceApp)//NOTE-theClassWizardwilladdandremovemappingmacroshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGON_COMMAND(ID_HELP,CWinApp::OnHelp)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CRouteTraceAppconstructionCRouteTraceApp::CRouteTraceApp(){//TODO:addconstructioncodehere,//PlaceallsignificantinitializationinInitInstance}///////////////////////////////////////////////////////////////////////////////TheoneandonlyCRouteTraceAppobjectCRouteTraceApptheApp;///////////////////////////////////////////////////////////////////////////////CRouteTraceAppinitializationBOOLCRouteTraceApp::InitInstance(){AfxEnableControlContainer();//Standardinitialization//Ifyouarenotusingthesefeaturesandwishtoreducethesize//ofyourfinalexecutable,youshouldremovefromthefollowing//thespecificinitializationroutinesyoudonotneed.#ifdef_AFXDLLEnable3dControls(); //CallthiswhenusingMFCinasharedDLL#elseEnable3dControlsStatic();//CallthiswhenlinkingtoMFCstatically#endifCRouteTraceDlgdlg;m_pMainWnd=&dlg;intnResponse=dlg.DoModal();if(nResponse==IDOK){//TODO:Placecodeheretohandlewhenthedialogis//dismissedwithOK}elseif(nResponse==IDCANCEL){//TODO:Placecodeheretohandlewhenthedialogis//dismissedwithCancel}//Sincethedialoghasbeenclosed,returnFALSEsothatweexitthe//application,ratherthanstarttheapplication'smessagepump.returnFALSE;}源代码:ICMRcpp//ICMP.cpp:implementationoftheCICMPclass.#include"stdafx.h"#include"RouteTrace.h"#include"ICMP.h"#include"ws2tcpip.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////CICMP::CICMP(){winsock=0;m_pIp=NULL;m_pIcmp=NULL;m_pIp=(IP_HEAD*)newBYTE[MAX_PACKET];m_pIcmp=(ICMP_HEAD*)newBYTE[MAX_PACKET];}CICMP::~CICMP(){delete[]m_pIp;delete[]m_pIcmp;}BOOLCICMP::Initialize(){WSADATAwsadata;if(WSAStartup(MAKEWORD(2,1),&wsadata)){ AfxMessageBox("WSAStartup初始化失败!");returnFALSE;}winsock=WSASocket(AF_INET,//建立socketSOCK_RAW,IPPROTO_ICMP,NULL,0,0);if(!winsock){AfxMessageBox("Socket创建失败!");returnFALSE;}inttimeout=5000;setsockopt(winsock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,//设置接收超时sizeof(timeout));timeout=5000;setsockopt(winsock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, //设置发送超时sizeof(timeout));returnTRUE;}voidCICMP::Uninitialize() //释放Socket{if(winsock)closesocket(winsock);WSACleanup();}USHORTCICMP::CheckSum(USHORT*buffer,intsize)//计算校验和{unsignedlongcksum=0;while(size>1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}BOOLCICMP::SendICMPPack(char*pAddr){sockaddr_insockAddr;memset((void*)&sockAddr,0,sizeof(sockAddr));sockAddr.sin_family=AF_INET;sockAddr.sin_port=0;sockAddr.sin_addr.S_un.S_addr=inet_addr(pAddr);returnSendICMPPack(&sockAddr);}// 设置TTL intCICMP::SetTTL(intTTL){intnRet=setsockopt(winsock,IPPROTO_IP,IP_TTL,(LPSTR)&TTL,sizeof(int));if(nRet==SOCKET_ERROR){ CStringttlerr;ttlerr・Format(‘设置TTL错误!");AfxMessageBox(ttlerr);return0;}return1;}// 发送 BOOLCICMP::SendICMPPack(sockaddr_in*pAddr){//填充ICMP数据各项intstate;char*p_data;m_pIcmp->type=ICMP_ECHO;m_pIcmp->code=0;m_pIcmp->ID=(USHORT)GetCurrentProcessId();m_pIcmp->number=0;m_pIcmp->time=GetTickCount();m_pIcmp->cksum=0;//填充数据p_data=((char*)m_pIcmp+sizeof(ICMP_HEAD));memset((char*)p_data,'0',DEF_PACKET);//检查和m_pIcmp->cksum=CheckSum((USHORT*)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD));//发送数据state=sendto(winsock,(char*)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD),NULL,(structsockaddr*)pAddr,sizeof(sockaddr));if(state==SOCKET_ERROR){if(GetLastError()==WSAETIMEDOUT)m_strInfo="连接超时!(发送)";elsem_strInfo="出现未知发送错误!";returnFALSE;}if(state<DEF_PACKET){m_strInfo="发送数据错误!";returnFALSE;}memcpy((void*)&m_sockAddr,(void*)pAddr,sizeof(sockaddr_in));returnTRUE;}// 接收数据 BOOLCICMP::RecvICMPPack(){intstate;intlen=sizeof(sockaddr_in);char*addr;structhostent*lpHostent=NULL;intMaxfd=1;//监视的最大的文件描述符值+1fd_setreadFdSet;//设置文件描述符structtimevalTimeout;addr=inet_ntoa(m_sockAddr.sin_addr);FD_ZERO(&readFdSet);FD_SET(winsock,&readFdSet);Maxfd=max(Maxfd,winsock)+1;Timeout.tv_sec=10;//设置响应时间限制Timeout.tv_usec=0;inte=::select(Maxfd,&readFdSet,NULL,NULL,&Timeout);//获取多路复用套接字的响应结果if(e<=0){routeaddr="****";routestate=1;RouteState="超时未知";returnFALSE;if(!FD_ISSET(winsock,&readFdSet))returnFALSE;state=recvfrom(winsock,(char*)m_pIp,MAX_PACKET,0,(structsockaddr*)&m_sockAddr,&len);if(state==SOCKET_ERROR){if(WSAGetLastError()==WSAETIMEDOUT){m_strInfo.Format("接收超时,路由跟踪失败!");routestate=0;RouteState="路由跟踪失败!";}elsem_strInfo="未知接收错误!";returnFALSE;}//分析数据intipheadlen;ipheadlen=m_pIp->HeadLen*4;if(state<(ipheadlen+MIN_PACKET)){m_strInfo="目的地址的响应数据不正确";returnFALSE;}ICMP_HEAD*p_icmprev;p_icmprev=(ICMP_HEAD*)((char*)m_pIp+ipheadlen);switch(p_icmprev->type){caseICMP_ECHOREPLY://收到正常回显{m_strInfo.Format("接收到%s%d字节响应数据,响应时间:%dms・",inet_ntoa(m_sockAddr.sin_addr),len,GetTickCount()-p_icmprev->time);routeaddr=addr;routestate=0;RouteState="到达目的主机!";returnTRUE;break;}caseICMP_TTLOUT:〃TTL超时{routeaddr=inet_ntoa(m_sockAddr・sin_addr);routestate=1;RouteState="测试到路由器!";returnTRUE;break;}caseICMP_DESUNREACH://目的不可达{m_strInfo="目的不可达!";routestate=0;RouteState="目的不可达";returnTRUE;break;
default:{routestate=0;routeaddr="***";m_strInfo="未知错误!";RouteState="不明状态!";}}returnTRUE;}2、命令行窗口下运行:tracert命令,记录运行结果和网站IP地址。dq:\Timj01S\systea.32^CBd・ezehicvcsoftUindou?XP 5.1.2660]<C>版取祈有1985-2001MicioooftCorp.SDocurientsandSettIngsMhduiinIstrator>tFaceFtww・丄石3・coiloneramaximumof39hops:1<1ns<1ms<1ms2oneramaximumof39hops:1<1ns<1ms<1ms2<1ns<1ms<1tins.13<1ns<1ms<1nsd<1ms<1ms262.112.G.E5rms<1ms<1ms0G1R13:7ms7PiS071ns1msims丄1»1ns1ms丫ms112.41.17891ns1ms1ms82te***Requesttimedout.it***Reuuesttimedout.121ns1ms1ms162.105.2B.233[IpacecompleteaTracingI'onteto163.xdwscache.glhB・I[162.105.28・2333C;SDociinientsandSetl^iriigrsM^dniinistri<i1;uri>险歌拼咅半;接收到1迄接收到1迄105.2S.233出字节响应数据,响应时间:口佔.目的地址|1S2.105.2B.233 三|壘丈眺數『蹶二劇壘丈眺數路由器地址162.105.28.233
****202.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论