Tracert 程序设计报告_第1页
Tracert 程序设计报告_第2页
Tracert 程序设计报告_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE9设计报告课 程 计算机网络设计名称 Tracert程专业班级 计科112实验日期指导教成 年 月 日一、设计目的和要求1、实验目的熟悉原始套接字编程。了解网络的结构。了解网络传输底层协议。熟悉掌握ICMP掌握vc6.0通过实验熟悉协议的应用。2、实验要求1、通过实验,可以使程序记录并显示了数据报从源端机器传送到目标机器的过程中所经过的路由器的IP地址,并且记录了数据报到达每个路由器所需要的时间。认真观察到达每个路由器的时间有什么区别,从而熟练掌握tracert的工作原理和ICMP报文协议。2、当我们不能通过网络访问目的设备时,网络管理员就需要判断是哪里出了问题。问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。二、设计说明(包括设计分析,系统运行环境,设计中的重点和难点,输入和输出输出条件等)是利用路由跟踪实用程序于确定IPIPtracerttraceroutepingpingtracertIPPing。该实用程序跟踪的路径是源计算机到目的地的一条路径,Tracert(指定的目标地址比较远15TracerttracertIP相应的域名转换,TracerttracertIP节上出了问题,虽然还是没有确定是什么问题,但它已经告诉了我们问题所在的地方。三、系统详细设计(包括程序流程、主要函数等)开始使用UDP协议创建原始UDP包Y NTTL+(初始值为1)填充UDP数据包并发送N有数据报到达?YN 有预期数据报?Y解析数据报并显示输出 超时显示超时信息释放各种资源显示结果信息结束四、程序源代码及注释#include<iostream.h>#include<iomanip.h>#include<winsock2.h>#include<ws2tcpip.h>#include"itracert.h"////////////////////////////////////////////////////////intmain(intargc,char*argv[]){//if(argc!=2){cerr<<"\nUsage:itracertreturn-1;}//winsock2WSADATAwsa;if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){cerr<<"\nFailedtoinitializetheWinSock2DLL\n"<<"errorcode:"<<WSAGetLastError()<<endl;return-1;}//将命令行参数转换为IP地址u_longulDestIP=inet_addr(argv[1]);if(ulDestIP==INADDR_NONE){//转换不成功时按域名解析hostent*pHostent=gethostbyname(argv[1]);if(pHostent){ulDestIP=(*(in_addr*)pHostent->h_addr).s_addr;//输出屏幕信息cout<<"\nTracingrouteto"<<argv[1]<<"["<<inet_ntoa(*(in_addr*)(&ulDestIP))<<"]"<<"withamaximumof"<<DEF_MAX_HOP<<"hops.\n"<<endl;}else//解析主机名失败{cerr<<"\nCouldnotresolvethehostname"<<argv[1]<<'\n'<<"errorcode:"<<WSAGetLastError()<<endl;WSACleanup();return-1;}}else{//输出屏幕信息cout<<"\nTracingrouteto"<<argv[1]<<"withamaximumof"<<DEF_MAX_HOP<<"hops.\n"<<endl;}//填充目的Socket地址sockaddr_indestSockAddr;ZeroMemory(&destSockAddr,sizeof(sockaddr_in));destSockAddr.sin_family=AF_INET;destSockAddr.sin_addr.s_addr=ulDestIP;//使用ICMP协议创建RawSocketSOCKETsockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(sockRaw==INVALID_SOCKET){cerr<<"\nFailedtocreatearawsocket\n"<<"errorcode:"<<WSAGetLastError()<<endl;WSACleanup();return-1;}设置端口属性intiTimeout=DEF_ICMP_TIMEOUT;if(setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeout,sizeof(iTimeout))==SOCKET_ERROR){cerr<<"\nFailedtosetrecvtimeout\n"<<"errorcode:"<<WSAGetLastError()<<endl;closesocket(sockRaw);WSACleanup();return-1;}if(setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeout,sizeof(iTimeout))==SOCKET_ERROR){cerr<<"\nFailedtosetsendtimeout\n"<<"errorcode:"<<WSAGetLastError()<<endl;closesocket(sockRaw);WSACleanup();return-1;}//创建ICMP包发送缓冲区和接收缓冲区charIcmpSendBuf[sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE];memset(IcmpSendBuf,0,sizeof(IcmpSendBuf));charIcmpRecvBuf[MAX_ICMP_PACKET_SIZE];memset(IcmpRecvBuf,0,sizeof(IcmpRecvBuf));//填充待发送的ICMP包ICMP_HEADER*pIcmpHeader=(ICMP_HEADER*)IcmpSendBuf;pIcmpHeader->type=ICMP_ECHO_REQUEST;pIcmpHeader->code=0;pIcmpHeader->id=(USHORT)GetCurrentProcessId();memset(IcmpSendBuf+sizeof(ICMP_HEADER),'E',DEF_ICMP_DATA_SIZE);//开始探测路由DECODE_RESULTstDecodeResult;BOOLbReachDestHost=FALSE;USHORTusSeqNo=0;intiTTL=1;intiMaxHop=DEF_MAX_HOP;while(!bReachDestHost&&iMaxHop--){//设置IP数据报头的ttl字段setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char*)&iTTL,sizeof(iTTL));//输出当前跳站数作为路由信息序号cout<<setw(3)<<iTTL<<flush;//填充ICMP数据报剩余字段((ICMP_HEADER*)IcmpSendBuf)->cksum=0;((ICMP_HEADER*)IcmpSendBuf)->seq=htons(usSeqNo++);((ICMP_HEADER*)IcmpSendBuf)->cksum GenerateChecksum((USHORT*)IcmpSendBuf,sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE);//记录序列号和当前时间stDecodeResult.usSeqNo=((ICMP_HEADER*)IcmpSendBuf)->seq;stDecodeResult.dwRoundTripTime=GetTickCount();//ICMPEchoRequestif(sendto(sockRaw,IcmpSendBuf,sizeof(IcmpSendBuf),0,(sockaddr*)&destSockAddr, sizeof(destSockAddr)) SOCKET_ERROR){//如果目的主机不可达则直接退出if(WSAGetLastError()==WSAEHOSTUNREACH)cout<<'\t'<<"Destinationhostunreachable.\n"<<"\nTracecomplete.\n"<<endl;closesocket(sockRaw);WSACleanup();return0;}//ICMPEchoReply//因为收到的可能并非程序所期待的数据报,所以需要循环接收直到收到所要数据或超时sockaddr_infrom;intiFromLen=intiReadDataLen;while(1){//等待数据到达iReadDataLen = recvfrom(sockRaw, MAX_ICMP_PACKET_SIZE,0,(sockaddr*)&from,&iFromLen);if(iReadDataLen!=SOCKET_ERROR)//有数据包到达{EchoRequest

//解码得到的数据包,如果解码正确则跳出接收循环发送下一个if (DecodeIcmpResponse(IcmpRecvBuf, iReadDataLen,stDecodeResult)){

if (stDecodeResult.dwIPaddr.s_addr ==destSockAddr.sin_addr.s_addr)bReachDestHost=TRUE;cout<<'\t'<<inet_ntoa(stDecodeResult.dwIPaddr)<<endl;break;}}elseif(WSAGetLastError()==WSAETIMEDOUT)//接收超时,打印星号{cout<<setw(9)<<'*'<<'\t'<<"Requesttimedout."<<endl;break;}else{cerr<<"\nFailedtocallrecvfrom\n"<<"errorcode:"<<WSAGetLastError()<<endl;closesocket(sockRaw);WSACleanup();return-1;}}//TTLiTTL++;}//输出屏幕信息cout<<"\nTracecomplete.\n"<<endl;closesocket(sockRaw);WSACleanup();return0;}//产生网际校验和USHORTGenerateChecksum(USHORT*pBuf,intiSize){unsignedlongcksum=0;while(iSize>1){cksum+=*pBuf++;iSize-=sizeof(USHORT);}if(iSize)cksum+=*(UCHAR*)pBuf;cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}//解码得到的数据报BOOL DecodeIcmpResponse(char* pBuf, int iPacketSize, stDecodeResult){//检查数据报大小的合法性IP_HEADER*pIpHdr=(IP_HEADER*)pBuf;intiIpHdrLen=pIpHdr->hdr_len*4;if(iPacketSize<(int)(iIpHdrLen+sizeof(ICMP_HEADER)))returnFALSE;//ICMPidIcmpICMP_HEADER*pIcmpHdr=(ICMP_HEADER*)(pBuf+iIpHdrLen);USHORTusID,usSquNo;if(pIcmpHdr->type==ICMP_ECHO_REPLY){usID=pIcmpHdr->id;usSquNo=pIcmpHdr->seq;}elseif(pIcmpHdr->type==ICMP_TIMEOUT){char*pInnerIpHdr=pBuf+iIpHdrLen+sizeof(ICMP_HEADER); //IPintiInnerIPHdrLen=((IP_HEADER*)pInnerIpHdr)->hdr_len*4;//IPICMP_HEADER* pInnerIcmpHdr (ICMP_HEADER*)(pInnerIpHdr+iInnerIPHdrLen);//ICMPusID=pInnerIcmpHdr->id;usSquNo=pInnerIcmpHdr->seq;}elsereturnFALSE;if (usID != (USHORT)GetCurrentProcessId() usSq

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论