实验 ICMP协议实践ping解析_第1页
实验 ICMP协议实践ping解析_第2页
实验 ICMP协议实践ping解析_第3页
实验 ICMP协议实践ping解析_第4页
实验 ICMP协议实践ping解析_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机网络实验上机指导书专业 班级 学号 姓名 沈阳工程学院信息工程系实验2ICMP协议实践-ping解析一 实验目的掌握ICMP原理,利用其实现网络主机状态测试。二 实验内容 利用ICMP协议原理编程实现PING命令,测试目标主机是否可到达。并了解Ping实现原理。三 实验前的准备l 了解ICMP原理及相关概念。l 掌握相关软件编程知识。四 实验要求及实验软硬件环境【基本要求】l 设计程序完成PING命令。l 完成此项实验,完成实验报告。【实验组织方式】l 个人实验【实验条件】l 局域网环境下微机两台,编程软件。五 实验步骤.了解ICMP原理以及网络编程(1)源程序:Windows/ Pin

2、g.h/#pragma pack(1)#define ICMP_ECHOREPLY0#define ICMP_ECHOREQ8/ IP Header - RFC 791typedef struct tagIPHDRu_char VIHL;/ Version and IHLu_charTOS;/ Type Of ServiceshortTotLen;/ Total LengthshortID;/ IdentificationshortFlagOff;/ Flags and Fragment Offsetu_charTTL;/ Time To Liveu_charProtocol;/ Protoc

3、olu_shortChecksum;/ Checksumstructin_addr iaSrc;/ Internet Address - Sourcestructin_addr iaDst;/ Internet Address - DestinationIPHDR, *PIPHDR;/ ICMP Header - RFC 792typedef struct tagICMPHDRu_charType;/ Typeu_charCode;/ Codeu_shortChecksum;/ Checksumu_shortID;/ Identificationu_shortSeq;/ Sequencecha

4、rData;/ DataICMPHDR, *PICMPHDR;#define REQ_DATASIZE 32/ Echo Request Data size/ ICMP Echo Requesttypedef struct tagECHOREQUESTICMPHDR icmpHdr;DWORDdwTime;charcDataREQ_DATASIZE;ECHOREQUEST, *PECHOREQUEST;/ ICMP Echo Replytypedef struct tagECHOREPLYIPHDRipHdr;ECHOREQUESTechoRequest;char cFiller256;ECH

5、OREPLY, *PECHOREPLY;#pragma pack()/ PING.C - Ping program using ICMP and RAW Sockets/#include #include #include #include ping.h/ Internal Functionsvoid Ping(LPCSTR pstrHost);void ReportError(LPCSTR pstrFrom);int WaitForEchoReply(SOCKET s);u_short in_cksum(u_short *addr, int len);/ ICMP Echo Request/

6、Reply functionsintSendEchoRequest(SOCKET, LPSOCKADDR_IN);DWORDRecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *);/ main()void main(int argc, char *argv) WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); int nRet;/ Check arguments if (argc != 2) fprintf(stderr,nUsage: ping hostnamen);return; / Ini

7、t WinSock nRet = WSAStartup(wVersionRequested, &wsaData); if (nRet) fprintf(stderr,nError initializing WinSockn);return; / Check versionif (wsaData.wVersion != wVersionRequested)fprintf(stderr,nWinSock version not supportedn);return;/ Go do the pingPing(argv1);/ Free WinSock WSACleanup();/ Ping()/ C

8、alls SendEchoRequest() and/ RecvEchoReply() and prints resultsvoid Ping(LPCSTR pstrHost)SOCKET rawSocket;LPHOSTENT lpHost;struct sockaddr_in saDest;struct sockaddr_in saSrc;DWORD dwTimeSent;DWORD dwElapsed;u_char cTTL;int nLoop;int nRet;/ Create a Raw socketrawSocket = socket(AF_INET, SOCK_RAW, IPPR

9、OTO_ICMP);if (rawSocket = SOCKET_ERROR) ReportError(socket();return;/ Lookup hostlpHost = gethostbyname(pstrHost);if (lpHost = NULL)fprintf(stderr,nHost not found: %sn, pstrHost);return;/ Setup destination socket addresssaDest.sin_addr.s_addr = *(u_long FAR *) (lpHost-h_addr);saDest.sin_family = AF_

10、INET;saDest.sin_port = 0;/ Tell the user what were doingprintf(nPinging %s %s with %d bytes of data:n,pstrHost,inet_ntoa(saDest.sin_addr),REQ_DATASIZE);/ Ping multiple timesfor (nLoop = 0; nLoop 4; nLoop+)/ Send ICMP echo requestSendEchoRequest(rawSocket, &saDest);/ Use select() to wait for data to

11、be receivednRet = WaitForEchoReply(rawSocket);if (nRet = SOCKET_ERROR)ReportError(select();break;if (!nRet)printf(nTimeOut);break;/ Receive replydwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);/ Calculate elapsed timedwElapsed = GetTickCount() - dwTimeSent;printf(nReply from: %s: bytes=%d time=

12、%ldms TTL=%d, inet_ntoa(saSrc.sin_addr), REQ_DATASIZE, dwElapsed, cTTL);printf(n);nRet = closesocket(rawSocket);if (nRet = SOCKET_ERROR)ReportError(closesocket();/ SendEchoRequest()/ Fill in echo request header/ and send to destinationint SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr) static ECH

13、OREQUEST echoReq;static nId = 1;static nSeq = 1;int nRet;/ Fill in echo requestechoReq.icmpHdr.Type= ICMP_ECHOREQ;echoReq.icmpHdr.Code= 0;echoReq.icmpHdr.Checksum= 0;echoReq.icmpHdr.ID= nId+;echoReq.icmpHdr.Seq= nSeq+;/ Fill in some data to sendfor (nRet = 0; nRet 1 ) sum += *w+;nleft -= 2;/* mop up

14、 an odd byte, if necessary */if( nleft = 1 ) u_shortu = 0;*(u_char *)(&u) = *(u_char *)w ;sum += u;/* * add back carry outs from top 16 bits to low 16 bits */sum = (sum 16) + (sum & 0xffff);/* add hi 16 to low 16 */sum += (sum 16);/* add carry */answer = sum;/* truncate to 16 bits */return (answer);

15、实验结果如图6-1所示。图6-1 ping程序运行结果(2)LINUX /*简单的ping程序*/#include #include #include #include #include #include #include #include #include #include #include #include #define PACKET_SIZE 4096#define MAX_WAIT_TIME 5#define MAX_NO_PACKETS 3char sendpacketPACKET_SIZE;char recvpacketPACKET_SIZE;int sockfd,datalen

16、=56;int nsend=0,nreceived=0;struct sockaddr_in dest_addr;pid_t pid;struct sockaddr_in from;struct timeval tvrecv;void statistics(int signo);unsigned short cal_chksum(unsigned short *addr,int len);int pack(int pack_no);void send_packet(void);void recv_packet(void);int unpack(char *buf,int len);void t

17、v_sub(struct timeval *out,struct timeval *in);void statistics(int signo) printf(n-PING statistics-n); printf(%d packets transmitted, %d received , %d lostn,nsend,nreceived, (nsend-nreceived)/nsend*100); close(sockfd); exit(1);/*校验和算法*/unsigned short cal_chksum(unsigned short *addr,int len) int nleft

18、=len; int sum=0; unsigned short *w=addr; unsigned short answer=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/ while(nleft1) sum+=*w+; nleft-=2; /*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/ if( nleft=1) *(unsigned char *)(&answer)=*(unsigned char *)w; sum+=answer; sum=(sum16)+(sum&0xffff); sum+=

19、(sum16); answer=sum; return answer;/*设置ICMP报头*/int pack(int pack_no) int i,packsize; struct icmp *icmp; struct timeval *tval; icmp=(struct icmp*)sendpacket; icmp-icmp_type=ICMP_ECHO; icmp-icmp_code=0; icmp-icmp_cksum=0; icmp-icmp_seq=pack_no; icmp-icmp_id=pid; packsize=8+datalen; tval= (struct timev

20、al *)icmp-icmp_data; gettimeofday(tval,NULL); /*记录发送时间*/ icmp-icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/ return packsize;/*发送三个ICMP报文*/void send_packet() int packetsize; while( nsendMAX_NO_PACKETS) nsend+; packetsize=pack(nsend); /*设置ICMP报头*/ if( sendto(sockfd,sendpacket,packe

21、tsize,0, (struct sockaddr *)&dest_addr,sizeof(dest_addr) )0 ) perror(sendto error); continue; sleep(1); /*每隔一秒发送一个ICMP报文*/ /*接收所有ICMP报文*/void recv_packet() int n,fromlen; extern int errno; signal(SIGALRM,statistics); fromlen=sizeof(from); while( nreceivednsend) alarm(MAX_WAIT_TIME); if( (n=recvfrom(

22、sockfd,recvpacket,sizeof(recvpacket),0, (struct sockaddr *)&from,&fromlen) ip_hl2; /*求ip报头长度,即ip报头的长度标志乘4*/ icmp=(struct icmp *)(buf+iphdrlen); /*越过ip报头,指向ICMP报头*/ len-=iphdrlen; /*ICMP报头及ICMP数据报的总长度*/ if( lenicmp_type=ICMP_ECHOREPLY) & (icmp-icmp_id=pid) ) tvsend=(struct timeval *)icmp-icmp_data; tv_sub(&tvrecv,tvsend); /*接收和发送的时间差*/ rtt=tvrecv.tv_sec*1000+tvrecv.tv_usec/1000; /*以毫秒为单位计算rtt*/ /*显示相关信息*/ printf(%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f msn, len, inet_ntoa(from.sin_addr), icmp-icm

温馨提示

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

评论

0/150

提交评论