




免费预览已结束,剩余13页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ping程序分析报告课程名称: 老 师: 姓 名: 班 级: 学 号: 日 期: 目录1、Ping功能简介 1 2、程序流程图(1)主函数流程图 3(2)创建套接字流程图 3(3)建立IP选项头部流程图 4(4)创建SockRaw套接字的接收/发送时限属性流程图4(5)判断终端的主机名获取信息流程图 5(6)分配堆内存流程图 5(7)接收/发送ICMP数据包流程图 6(8)清空Socket库所占内存 7 (9)传参解析函数流程图 7(10)解析IP选项函数流程图 83、源代码清单 84、心得体会 161、ping功能简介Ping 是DOS命令,一般用于检测网络通与不通 ,也叫时延,其值越大,速度越慢PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。 它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。Ping 是Windows系列自带的一个可执行命令。利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。应用格式:Ping IP地址。该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。ping指的是端对端连通,通常用来作为可用性的检查, 但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。2、程序流程图 请求版本信息,创建一个套接口建立IP选项首部 创建SockRaw套接字的接收/发送时限属性失败 成功退出main函数,并返回一个值-1 调用memset函数 判断终端的主机名获取信息创建ICMP数据包,分配堆内存接收/发送ICMP数据包清空Socket库所占内存图1 main函数流程图调用WSAStartup()函数请求版本信息判断其返回值返回值为0,即执行 返回值为非0,即执行 失败 成功退出main函数,并返回一个值2 调用传参解析函数 用socket函数创建一个套接口,设置属性创建失败 创建成功 退出main函数,并返回一个值3 进入main函数步骤 图2创建套接字流程图 bRecordRoute TRUE FALSE调用setsockopt()函数,并判断其返回值返回值为 返回值为一个 进入main函数步骤SOCKET_ERROR IP_OPTIONS 的属性获得当前错误的进程号, 进入main函数步骤并输出错误信息图3 建立IP选项头部流程图调用setsockopt()函数设置套接字接收时限属性,判断其返回值设置失败 设置成功 取得错误的进程号,输出错误信息 timeout=1000;退出main 函数 调用setsockopt()函数设置套接字发送时限属性,判断其返回值设置失败 设置成功取得错误的进程号,输出错误信息 调用memset()函数填充数据段退出main 函数图4 创建SockRaw套接字的接收/发送时限属性流程图 将点分十进制地址转化为二进制地址 将该地址赋给dest.sin_addr.s_addr无效地址 判断其值 有效地址 通过主机名获取主机信息为NULL 不是NULL取得错误的进程号,输出错误信息, 输出主机信息 退出main 函数 进入main函数步骤图5判断终端的主机名获取信息流程图 利用HeapAlloc()分配堆内存函数 分配成功 分配失败调用memset()函数填充数据段 输出堆内存分配失败 推出主函数 调用ICMP首部初始化函数 返回值-1图6 分配堆内存流程图nCount=0nCount+nCount+=4break调用cksum 发送ICMP数据包 失败 成功 超时 bwrote datasizeY N N Y输出 退出 输出错误超时 函数 信息 sendto bread 失败 成功 超时 y n 调用 ICMP解析输出 退出 超时 sleep(1000)信息Sleep()图7 接收/发送ICMP数据包流程图套接口是否有效有效 无效 关闭套接口 利用HeapFree()函数释放堆释放SOCKET库所占的系统资源返回值0,退出主函数图8清空Socket库所占内存i=1 iagrc 数组argv的第i行第0列是否为-或/ YES NO 将数组argv 第i行第1列 判断数组argv第i行第0列 的字符转化为小写字母 的字符是否为数字 转化后为 其他字母 YES NO r bRecordRoute 调用usage()函数 将数组argv第i 将数组argv第i =TRUE; ;退出; 行的字符转化为 行的字符赋给 退出; 长整型数赋给datasize Ipdest i+图9 传参解析函数流程图i=0计算RR选项中记录的地址个数nii_type = ICMP_ECHO; /ICMP回显请求icmp_hdr-i_code = 0;icmp_hdr-i_id = (USHORT)GetCurrentProcessId();/取得当前进程号icmp_hdr-i_cksum = 0; /检验和字段置0icmp_hdr-i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader); /datapart指针指向数据报文开头memset(datapart, E, datasize - sizeof(IcmpHeader); /填充数据段/计算检验和USHORT checksum(USHORT *buffer, int size)unsigned long cksum = 0; / 检验和字段置0while (size 1)cksum += *buffer+;size -= sizeof(USHORT);if (size)cksum += *(UCHAR*)buffer;cksum = (cksum 16) + (cksum & 0xffff);/将检验和字段高16位右移16位再与低16位相加cksum += (cksum 16);/将所加的检验和再与剩余低16位相加return (USHORT)(cksum);/检验和取反,并返回/解析IP选项void DecodeIPOptions(char *buf, int bytes)IpOptionHeader *ipopt = NULL;IN_ADDR inaddr; /声明结构体int i;HOSTENT *host = NULL;ipopt = (IpOptionHeader *)(buf + 20); /去掉IP首部,指针指向数据选项首部printf(RR: );for(i = 0; i ptr / 4) - 1; i+)inaddr.S_un.S_addr = ipopt-addri;if (i != 0)printf( );host = gethostbyaddr(char *)&inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);/通过IP地址获得主机信息if (host)printf(%-15s) %sn, inet_ntoa(inaddr), host-h_name); /打印IP地址和主机名elseprintf(%-15s)n, inet_ntoa(inaddr); /打印IP地址return;/解析ICMP首部函数void DecodeICMPHeader(char *buf, int bytes, struct sockaddr_in *from)IpHeader *iphdr = NULL;IcmpHeader *icmphdr = NULL;unsigned short iphdrlen;DWORD tick; /毫秒级数static int icmpcount = 0;iphdr = (IpHeader *)buf;iphdrlen = iphdr-h_len * 4; /IP首部实际长度tick = GetTickCount();/获得毫秒级数if (iphdrlen = MAX_IP_HDR_SIZE) & (!icmpcount) /判断是否为一个IP数据包DecodeIPOptions(buf, bytes); /调用IP 选项解析函数if (bytes sin_addr);icmphdr = (IcmpHeader*)(buf + iphdrlen); /指针指向ICMP报文首部if (icmphdr-i_type != ICMP_ECHOREPLY) /判断ICMP类型是否为ICMP回显应答printf(nonecho type %d recvdn, icmphdr-i_type); /输出其类型return;if (icmphdr-i_id != (USHORT)GetCurrentProcessId()/获得当前进程的ID,判断是否为ICMP标识printf(someone elses packet!n);return ;printf(%d bytes from %s:, bytes, inet_ntoa(from-sin_addr);printf( icmp_seq = %d. , icmphdr-i_seq); /输出ICMP序列号printf( time: %d ms, tick - icmphdr-timestamp); /打印时间戳printf(n);icmpcount+;return;/传参解析函数void ValidateArgs(int argc, char *argv)int i;bRecordRoute = FALSE;赋初值lpdest = NULL;datasize = DEF_PACKET_SIZE; /初始化datasize,使其等于差错报文长度for(i = 1; i h_addr, hp-h_length);dest.sin_family = hp-h_addrtype;将hp-h_addrtype的类型赋给dest.sin_familyprintf(dest.sin_addr = %sn, inet_ntoa(dest.sin_addr);/输出IP地址elseprintf(gethostbyname() failed: %dn,WSAGetLastError();return -1;退出main函数,并返回值-1datasize += sizeof(IcmpHeader);icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);/分配堆内存recvbuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);if (!icmp_data)/分配失败printf(HeapAlloc() failed: %dn, GetLastError();/获得当前错误进程号,输出“堆内存分配失败”return -1; /退出main函数,并返回值-1memset(icmp_data,0,MAX_PACKET);/填充数据段FillICMPData(icmp_data,datasize);/调用ICMP 初始化函数while(1)static int nCount = 0; /初始化int bwrote;if (nCount+ = 4)break;结束整个循环(IcmpHeader*)icmp_data)-i_cksum = 0;(IcmpHeader*)icmp_data)-timestamp = GetTickCount();/设定时间戳(IcmpHeader*)icmp_data)-i_seq = seq_no+;/设置ICMP头部序列号(IcmpHeader*)icmp_data)-i_cksum =checksum(USHORT*)icmp_data, datasize);/调用计算检验和函数,将其返回值赋给i_cksumbwrote = sendto(sockRaw, icmp_data, datasize, 0,(struct sockaddr*)&dest, sizeof(dest); /发送ICMP数据包if (bwrote = SOCKET_ERROR) /发送失败if (WSAGetLastError() = WSAETIMEDOUT) /当前错误进程号为超时printf(timed outn);continue; /结束本次循环printf(sendto() failed: %dn, WSAGetLastError();return -1; /退出main函数,并返回值-1if (bwrote datasize)/已发送字节数小于datasizeprintf(Wrote %d bytesn, bwrote);bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);/ 接收ICMP数据包if (bread = SOCKET_ERROR) /接收失败if (WSAGetLastError() = WSAETIMEDOUT) /当前错误进程号为超时printf(timed outn); continue; /结束本次循环printf(recvfrom() failed: %dn, WSAGetLastError();return -1; 退出main函数,并返回值-1DecodeICMPHeader(recvbuf, bread, &from); /调用解析ICMP头部函数Sleep(1000);/暂停1000msif (sockRaw != INVALID_SOCKET) /套接字有效closesocket(sockRaw); /关闭套接字HeapFree(GetProcessHeap(), 0, recvbuf);HeapFree(GetProcessHeap(), 0, icmp_data); /释放堆内存WSACleanup();/应用程序完成对请求的Socket库的使用调用WSACleanup()函数来解除与Socket库的绑定并释放Socket库所占的系统资源return 0; /退出main函数,并返回值0五、心得体会 了解Ping程序的运行过程;了解程序如何实现检验和的计算,当程序发送数据时需要计算其检验
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 61000-4-11:1994+AMD1:2000 CSV EN-D Electromagnetic compatibility (EMC) - Part 4-11: Testing andmeasurement techniques - Voltage dips,short interruptions and voltage v
- 【正版授权】 IEC 60601-1:2025 SER EN-FR Medical electrical equipment - ALL PARTS
- 北京高尔夫球童培训知识课件
- 北京食品安全知识培训课件
- 趣味体态测试题及答案
- 安装预算考试题及答案
- 跆拳道裁判员技术考试试题及答案
- 精神问题测试题及答案
- 福田物业面试题及答案
- 探伤防护考试题及答案
- 小儿泄泻(小儿腹泻病)中医临床路径
- 免疫05-第五章-免疫凝集试验
- 2025年中国东方航空集团招聘笔试参考题库含答案解析
- C919机组培训-导航系统
- 高考地理易错题专练:地球运动易错突破(4大易错)含答案及解析
- 2025年上半年上海海港综合经济开发区招考易考易错模拟试题(共500题)试卷后附参考答案
- 2024ESC心房颤动管理指南解读
- 2024年度礼品设计创新研发合同3篇
- 树木砍伐用工合同模板
- 小学班主任资料-家校联系本
- 氧化铝制取全套教学教程整套课件全书电子教案
评论
0/150
提交评论