ICMP协议应用——Ping解析

上传人:豆** 文档编号:45406139 上传时间:2021-12-07 格式:DOC 页数:7 大小:62KB
收藏 版权申诉 举报 下载
ICMP协议应用——Ping解析_第1页
第1页 / 共7页
ICMP协议应用——Ping解析_第2页
第2页 / 共7页
ICMP协议应用——Ping解析_第3页
第3页 / 共7页
资源描述:

《ICMP协议应用——Ping解析》由会员分享,可在线阅读,更多相关《ICMP协议应用——Ping解析(7页珍藏版)》请在装配图网上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除 沈阳工程学院 学 生 实 验 报 告 实验室名称: 实验课程名称:计算机网络 实验项目名称:ICMP协议应用——Ping解析 班 级: 指导教师: 实验日期:2010年12月06日 试验台编号: 批阅教师(签字): 姓名: 学号: 成绩: 一.实验目的 1.掌握ICMP原理,体会网络层编程的不同; 2.理解ICMP报文的作用,了解基本的网络编程框架。 二.实验内容 1. 解析Ping程序的基本实现

2、过程。 2. 体会ICMP协议在Ping程序中的应用。 3. 体会基本的C/S编程框架。 三.实验前的准备 l 掌握ICMP原理及相关概念。 l 掌握C语言编程知识。 l 掌握基本的网络编程内容 四.实验要求及实验软硬件环境 【基本要求】 l 对Ping程序进行调试并运行实现。 l 解析ping程序的主要部分,从而体会ICMP协议的应用。 l 完成此项实验,完成实验报告。 【实验组织方式】 l 小组实验 【实验条件】 l 局域网环境下微机二台,编程软件。 五.实验步骤 1.熟悉IP以及ICMP协议的工作机制; 2.熟悉创建原始套接字、IP报头和ICMP报头;

3、 3.体会ICMP协议的作用与特点; 4.调试ICMP协议的Ping实现程序; 5.参加答辩,并撰写实验报告 六.主要程序部分(C++语言实现) #define WIN32_LEAN_AND_MEAN #include #include #include #include #define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0 #define ICMP_MIN 12 packet (just header) typedef struct i

4、phdr { unsigned char h_len:4; unsigned char version:4; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short frag_and_flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sourceIP; unsigned int destIP; }IpHeader; typedef stru

5、ct _ihdr { BYTE i_type; BYTE i_code; USHORT i_cksum; USHORT i_id; USHORT i_seq; ULONG timestamp; }IcmpHeader; #define STATUS_FAILED 0xFFFF #define MAX_PACKET 1024 #definexmalloc(s) (char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)) #define xfree(p) HeapFree(GetProcessHeap(

6、),0,(p)) USHORT checksum(USHORT *, int); void fill_icmp_head(char *); void decode_resp(char *,int ,struct sockaddr_in *); void Usage(char *progname) fprintf(stderr,"Usage:\n"); fprintf(stderr,"%s \n",progname); ExitProcess(STATUS_FAILED); int main(int argc, char **argv) WSADATA wsaDat

7、a; SOCKET sockRaw; struct sockaddr_in dest,from; struct hostent *hp; int bread,datasize; int fromlen = sizeof(from); char *dest_ip; char *icmp_data; char *recvbuf; char host[256]; unsigned int addr=0; USHORT seq_no = 0; if (WSAStartup(0x0101,&wsaData) != 0) fprintf(stderr,"WSAStartup fa

8、iled: %d\n",GetLastError()); ExitProcess(STATUS_FAILED); if (argc >1 ) strcpy(host,argv[1]); else printf("Please input hostname(Press enter key for localhost)\nInput:"); gets(host); if(strlen(host)<1) strcpy(host,"localhost"); if((sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==INVALID_SOCK

9、ET) fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); ExitProcess(STATUS_FAILED); memset(&dest,0,sizeof(dest)); hp = gethostbyname(host/*argv[1]*/); if (hp!=NULL) memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length); dest.sin_family = AF_INET; dest_ip = inet_ntoa(dest.sin_add

10、r); else { fprintf(stderr,"Unable to resolve %s\n",argv[1]); ExitProcess(STATUS_FAILED); datasize=sizeof(IcmpHeader); icmp_data = xmalloc(MAX_PACKET); recvbuf = xmalloc(MAX_PACKET); if (!icmp_data) { fprintf(stderr,"HeapAlloc failed %d\n",GetLastError()); ExitProcess(ST

11、ATUS_FAILED); memset(icmp_data,0,MAX_PACKET); fill_icmp_head(icmp_data); while(1) int bwrote; ((IcmpHeader*)icmp_data)->i_cksum = 0; ((IcmpHeader*)icmp_data)->timestamp = GetTickCount(); ((IcmpHeader*)icmp_data)->i_seq = seq_no++; ((IcmpHeader*)icmp_data)->i_cksum=checksum((USHORT*)icmp_

12、data, sizeof(IcmpHeader)); bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); if (bwrote == SOCKET_ERROR) fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); if (bwrote < datasize ) fprintf(stdout,"Wrote

13、%d bytes\n",bwrote); bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&from,&fromlen); if (bread == SOCKET_ERROR) if (WSAGetLastError() == WSAETIMEDOUT) { printf("timed out\n"); continue; fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()); perror("revffro

14、m failed."); ExitProcess(STATUS_FAILED); decode_resp(recvbuf,bread,&from); Sleep(2000); } closesocket(sockRaw); xfree(icmp_data); xfree(recvbuf ); WSACleanup(); return 0; vo

15、id fill_icmp_head(char * icmp_data) { IcmpHeader *icmp_hdr; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_cksum = 0; icmp_hdr->i_id= (USHORT)GetCurrentProcessId(); icmp_hdr->i_seq = 0; void decode_re

16、sp(char *buf, int bytes,struct sockaddr_in *from) { IpHeader *iphdr; IcmpHeader *icmphdr; unsigned short iphdrlen; iphdr = (IpHeader *)buf; iphdrlen = iphdr->h_len * 4 ; if (bytes < iphdrlen + ICMP_MIN) printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr)); i

17、cmphdr = (IcmpHeader*)(buf + iphdrlen); if (icmphdr->i_type != ICMP_ECHOREPLY) { fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type); return; if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) { fprintf(stderr,"someone elses packet!\n"); return ; printf("\n%d bytes

18、from %s:",bytes, inet_ntoa(from->sin_addr)); printf(" icmp_seq = %d. ",icmphdr->i_seq); printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp); USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); if(size)

19、 cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); 七.结果分析 运行结果如图1所示: 图1 运行结果 运行结果可看出此程序不断地在向172.20.106.45发送数据包,并且得到了应答。 八.个人总结 此次网络实验涉及到我们非常不熟练的基于网络协议的编程。Ping命令虽然是我们最先接触到的网络命令,

20、但ping命令是来自于哪个网络层次的哪个协议并且是具体是如何实现的,我们就有些疑惑了,通过本次实验我们了解到 ICMP协议是一个非常重要的协议,它对于网络安全、网络的正常运作具有极其重要的意义。它被用于在IP主机、路由器之间传递控制消息,如网络通不通、主机是否可达、路由是否可用等。实验中将原始数据在网络层添加IP报头和数据链路层添加ICMP的报头,再在目的端解封装这两个报头。我们小组已经对ICMP的原理及作用有了进一步的了解,将在以后的学习中发挥更大的作用。 教师评语: 教师签字: 年 月 日 【精品文档】第 7 页

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

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!