版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-作者xxxx-日期xxxx网络通信程序设计实验二路由跟踪【精品文档】 实 验 报 告 课程名称 网络通信程序设计 实验仪器 计算机 实验名称 路由跟踪 系 别 _计算机学院_ 专 业 _ 班级/学号_ _学生姓名 实验日期 2014年4月6日 成 绩 _ 指导教师 焦健 实验二 路由跟踪实验一、实验目的 学习分析程序功能结构。熟悉ICMP协议的工作原理和路由跟踪的原理。掌握VC6.0下程序调试、运行的基本方法。二、实验原理路由跟踪的实现就是巧妙地利用了ICMP报文的TTL超时报文。其实现过程如下:源主机先向目的主机发送一个回应请求报文(类型8),TTL值设为1,第一个路由器收到后将TTL减1
2、,这样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_
3、Sock是所创建的套接字,IP_TTL说明是进行TTL设置,TTL即是要设置的TTL值,为一个整形数值 。其实现流程如图1所示:图 1路由跟踪流程图三、实验内容 1、按照附录内容给RouteTrace程序添加代码,增加注释,调试程序通过。源代码:/ RouteTrace.cpp : Defines the class behaviors for the application.#include "stdafx.h"#include "RouteTrace.h"#include "RouteTraceDlg.h"#ifdef _DEBU
4、G#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CRouteTraceAppBEGIN_MESSAGE_MAP(CRouteTraceApp, CWinApp)/AFX_MSG_MAP(CRouteTraceApp)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSGON_CO
5、MMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()/ CRouteTraceApp constructionCRouteTraceApp:CRouteTraceApp()/ TODO: add construction code here,/ Place all significant initialization in InitInstance/ The one and only CRouteTraceApp objectCRouteTraceApp theApp;/ CRouteTraceApp initializationBOOL CRoute
6、TraceApp:InitInstance()AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call
7、this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC statically#endifCRouteTraceDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK) / TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = ID
8、CANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the application's message pump.return FALSE;源代码:ICMP.cpp / ICMP.cpp: implementation of the CICMP class.#include &
9、quot;stdafx.h"#include "RouteTrace.h"#include "ICMP.h"#include "ws2tcpip.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/CICMP:CICMP()winsock = 0;m_pIp = NULL;m_pIcmp = NULL;m_pIp = (IP_HEAD *)new BY
10、TEMAX_PACKET;m_pIcmp = (ICMP_HEAD *)new BYTEMAX_PACKET;CICMP:CICMP()delete m_pIp;delete m_pIcmp;BOOL CICMP:Initialize()WSADATA wsadata;if( WSAStartup(MAKEWORD(2, 1),&wsadata) ) AfxMessageBox("WSAStartup初始化失败!");return FALSE;winsock= WSASocket (AF_INET, /建立socket SOCK_RAW, IPPROTO_ICMP,
11、 NULL, 0,0);if(!winsock)AfxMessageBox( "Socket创建失败!");return FALSE;int timeout =5000;setsockopt(winsock,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout, /设置接收超时sizeof(timeout);timeout = 5000;setsockopt(winsock,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout, /设置发送超时sizeof(timeout);return TRUE;void
12、 CICMP:Uninitialize() /释放Socketif(winsock)closesocket(winsock);WSACleanup();USHORT CICMP:CheckSum(USHORT *buffer, int size) /计算校验和 unsigned long cksum = 0; while(size > 1) cksum+=*buffer+;size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff)
13、; cksum += (cksum >>16); return (USHORT)(cksum);BOOL CICMP:SendICMPPack(char *pAddr)sockaddr_in sockAddr;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);return SendICMPPack(&sockAddr);/-设置TTL-
14、int CICMP:SetTTL(int TTL)int nRet=setsockopt(winsock, IPPROTO_IP, IP_TTL,(LPSTR)&TTL,sizeof(int); if(nRet=SOCKET_ERROR) CString ttlerr;ttlerr.Format("设置 TTL 错误!");AfxMessageBox(ttlerr);return 0;return 1;/-发送-BOOL CICMP:SendICMPPack(sockaddr_in *pAddr)/填充ICMP数据各项int state;char *p_data;m
15、_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 = CheckS
16、um(USHORT *)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD);/发送数据state = sendto(winsock,(char *)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD),NULL,(struct sockaddr *)pAddr,sizeof(sockaddr);if(state = SOCKET_ERROR) if(GetLastError()=WSAETIMEDOUT)m_strInfo = "连接超时!(发送)"elsem_strInfo="出现未知发送错误!"return
17、FALSE;if(state <DEF_PACKET) m_strInfo = "发送数据错误!"return FALSE;memcpy(void *)&m_sockAddr,(void *)pAddr,sizeof(sockaddr_in);return TRUE;/-接收数据-BOOL CICMP:RecvICMPPack()int state;int len = sizeof(sockaddr_in);char * addr; struct hostent *lpHostent = NULL; int Maxfd = 1; / 监视的最大的文件描述符值+
18、1 fd_set readFdSet; / 设置文件描述符 struct timeval Timeout; 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; int e = :select(Maxfd, &readFdSet, NULL, NULL, &Timeout
19、); /获取多路复用套接字的响应结果 if(e <= 0) routeaddr="*"routestate=1;RouteState="超时未知" return FALSE; if(!FD_ISSET(winsock, &readFdSet) return FALSE;state=recvfrom(winsock,(char*)m_pIp,MAX_PACKET,0,(struct sockaddr*)&m_sockAddr,&len);if (state = SOCKET_ERROR) if (WSAGetLastError
20、() = WSAETIMEDOUT)m_strInfo.Format("接收超时,路由跟踪失败!");routestate=0;RouteState="路由跟踪失败!"elsem_strInfo = "未知接收错误!"return FALSE;/分析数据int ipheadlen;ipheadlen = m_pIp->HeadLen * 4 ;if (state < (ipheadlen+MIN_PACKET)m_strInfo = "目的地址的响应数据不正确"return FALSE;ICMP_HEA
21、D * p_icmprev;p_icmprev = (ICMP_HEAD*)(char *)m_pIp + ipheadlen); switch (p_icmprev->type)case ICMP_ECHOREPLY: /收到正常回显m_strInfo.Format("接收到%s %d字节响应数据,响应时间:%dms.",inet_ntoa(m_sockAddr.sin_addr),len,GetTickCount()-p_icmprev->time);routeaddr=addr;routestate=0; RouteState="到达目的主机!" return TRUE;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年代理销售合同协议简单版(4篇)
- 2025年个人软件合同样本(2篇)
- 2025年九年级初三第二学期班主任工作小结模版(二篇)
- 2025年企业劳资专项法律服务合同经典版(2篇)
- 2025年人教版二年级上语文教学工作总结模版(三篇)
- 2025年二手商铺租赁合同标准版本(4篇)
- 2025年三方月嫂保姆合同(三篇)
- 办公室基础装修合作协议
- 液态碱液罐车配送合同
- 古建筑修缮服务合同
- 四川省算力基础设施高质量发展行动方案(2024-2027年)
- 托育园老师培训
- 人教版八年级英语上册Unit1-10完形填空阅读理解专项训练
- 脊柱外科护理进修心得
- 4.1中国特色社会主义进入新时代+课件-2024-2025学年高中政治统编版必修一中国特色社会主义
- 护理工作中的人文关怀
- 完整液压系统课件
- 生产制造工艺流程规范与作业指导书
- 班级建设方案中等职业学校班主任能力大赛
- T-TJSG 001-2024 天津市社会组织社会工作专业人员薪酬指导方案
- 芯片设计基础知识题库100道及答案(完整版)
评论
0/150
提交评论