ping程序设计

上传人:第*** 文档编号:32805215 上传时间:2018-02-12 格式:DOC 页数:14 大小:139KB
返回 下载 相关 举报
ping程序设计_第1页
第1页 / 共14页
ping程序设计_第2页
第2页 / 共14页
ping程序设计_第3页
第3页 / 共14页
ping程序设计_第4页
第4页 / 共14页
ping程序设计_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《ping程序设计》由会员分享,可在线阅读,更多相关《ping程序设计(14页珍藏版)》请在金锄头文库上搜索。

1、ping 程 序 设 计课程名称: 网络安全 老 师: 姓 名: 班 级: 学 号: 日 期: 1、 ping 功能简介Ping 是 DOS 命 令 , 一 般 用 于 检 测 网 络 通 与 不 通 , 也 叫 时 延 , 其 值 越 大 , 速 度 越 慢PING (Packet Internet Grope), 因 特 网 包 探 索 器 , 用 于 测 试 网 络 连 接 量 的 程 序 。Ping 发 送 一 个 ICMP 回 声 请 求 消 息 给 目 的 地 并 报 告 是 否 收 到 所 希 望 的 ICMP 回 声 应 答 。它 是 用 来 检 查 网 络 是 否 通 畅 或

2、 者 网 络 连 接 速 度 的 命 令 。 作 为 一 个 生 活 在 网 络 上 的管 理 员 或 者 黑 客 来 说 , ping 命 令 是 第 一 个 必 须 掌 握 的 DOS 命 令 , 它 所 利 用 的 原 理 是这 样 的 : 网 络 上 的 机 器 都 有 唯 一 确 定 的 IP 地 址 , 我 们 给 目 标 IP 地 址 发 送 一 个 数 据包 , 对 方 就 要 返 回 一 个 同 样 大 小 的 数 据 包 , 根 据 返 回 的 数 据 包 我 们 可 以 确 定 目 标 主 机的 存 在 , 可 以 初 步 判 断 目 标 主 机 的 操 作 系 统 等

3、。Ping 是 Windows 系 列 自 带 的 一 个 可 执 行 命 令 。 利 用 它 可 以 检 查 网 络 是 否 能 够 连 通 ,用 好 它 可 以 很 好 地 帮 助 我 们 分 析 判 定 网 络 故 障 。 应 用 格 式 : Ping IP 地 址 。 该 命 令 还可 以 加 许 多 参 数 使 用 , 具 体 是 键 入 Ping 按 回 车 即 可 看 到 详 细 说 明 。ping 指 的 是 端 对 端 连 通 , 通 常 用 来 作 为 可 用 性 的 检 查 , 但 是 某 些 病 毒 木 马 会 强 行大 量 远 程 执 行 ping 命 令 抢 占 你

4、 的 网 络 资 源 , 导 致 系 统 变 慢 , 网 速 变 慢 。2、程序流程图图 1 main 函 数 流 程 图图 1 main 函 数 流 程 图图 1 main 函 数 流 程 图图 1 main 函 数 流 程 图图 1 main 函 数 流 程 图请求版本信息,创建一个套接口建立 IP 选项首部创建 SockRaw 套接字的接收/发送时限属性失败 成功退出 main 函数,并返回一个值-1 调用 memset 函数 判断终端的主机名获取信息创建 ICMP 数据包,分配堆内存接收/发送 ICMP 数据包清空 Socket 库所占内存图 2 创 建 套 接 字 流 程 图图 3

5、建 立 IP 选 项 头 部 流 程 图图 4 创 建 SockRaw 套 接 字 的 接 收 /发 送 时 限 属 性 流 程 图调用 WSAStartup()函数请求版本信息判断其返回值返回值为 0,即执行失败 返回值为非 0,即执行成功退出 main 函数,并返回一个值 2 调用传参解析函数 用 socket 函数创建一个套接口,设置属性创建失败 创建成功 退出 main 函数,并返回一个值 3 进入 main 函数步骤 bRecordRouteTRUE FALSE调用 setsockopt()函数,并判断其返回值返回值为 返回值为一个 进入 main 函数步骤SOCKET_ERROR

6、IP_OPTIONS 的属性获得当前错误的进程号,并输出错误信息 进入 main 函数步骤调用 setsockopt()函数设置套接字接收时限属性,判断其返回值设置失败 设置成功 取得错误的进程号,输出错误信息 timeout=1000;退出 main 函数调用 setsockopt()函数设置套接字发送时限属性,判断其返回值设置失败 设置成功取得错误的进程号,输出错误信息 调用 memset()函数填充数据段退出 main 函数图 5 判 断 终 端 的 主 机 名 获 取 信 息 流 程 图图 6 分 配 堆 内 存 流 程 图将点分十进制地址转化为二进制地址将该地址赋给 dest.sin

7、_addr.s_addr无效地址 判断其值 有效地址通过主机名获取主机信息为 NULL 不是 NULL取得错误的进程号,输出错误信息, 输出主机信息 退出 main 函数进入 main 函数步骤利用 HeapAlloc()分配堆内存函数 分配成功 分配失败调用 memset()函数填充数据段 输出堆内存分配失败 推出主函数 调用 ICMP 首部初始化函数 返回值-1图 7 接 收 /发 送 ICMP 数 据 包 流 程 图图 8 清 空 Socket 库 所 占 内 存nCount=0nCount+nCount+=4break调用 cksum发送 ICMP 数据包失败 成功Y 超时 N N b

8、wrote i_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 checks

9、um(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 /将检验和字段高 16 位右移 16 位再与低 16 位相加cksum += (cksum 16);/将所加的检验和再与剩余低 16 位相加return (USHORT)(cksum);/检验和取反,并返回/解析 IP 选项void Dec

10、odeIPOptions(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 *)&inad

11、dr.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

12、;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 s

13、in_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:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号