版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计 课程名称题目名称学生学院专业班级学 号学生姓名指导教师2015 年 12月 28日目录一、课程设计目的与意义二、课程设计的要求三、设计说明3.1、设计思路3.2、设计方案3.3、运行环境3.4、设计重点四、详细设计 4.1、主程序流程图 4.2、校验和函数、释放资源函数流程图 4.3、ICMP报首部函数流程图五、程序的结果与分析六、课程设计心得体会附录一:参考文献附录二:程序源代码一、 课程设计的目的与意义利用ICMP数据包、C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试个主机到只一个主机之间的连通情况。通过本程序的训练,熟悉ICMP报
2、文结构,对ICMP有更深的理解,掌握Ping程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大的程序。二、课程设计的要求1.已知参数:目的节点IP地址或主机名2.设计要求:通过原始套接字编程,实现Ping的基本功能2.1初始化Windows Sockets网络环境;2.2解析命令行参数,构造目的端socket地址;2.3定义IP、ICMP报文;2.4接收ICMP差错报文并进行解析。三、设计说明1设计思路由于Ping程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的socket编程。首先定义IP数
3、据报首部,在IP数据报的基础上定义ICMP数据报首部,并初始化一些全局变量。接着自定义填充ICMP数据报字段函数FillICMPData()、校验和函数checksum()、解读ICMP报首部函数DecodeICMPHeader()、释放资源函Cleanup()。最后主函数通过调用这些函数来实现Ping命令功能。2. 设计方案IP头与ICMP头的设置分别参照RFC791及RFC792的标准,包含所有必要信息。主程序设置main()函数,主函数用库函数实现套接字编程用于数据包发送及接收,其中,数据包发送调用sendto(),数据包接收调用recvfrom( ),由于发送数据包时可能会遇到阻塞或者
4、目标主机不通,造成超时,因此需要在发送数据包后调用一个函数判断是否超时,此处调用库函数setsockopt()来实现超时判断;其次,校验和函数采用移位方法进行计算。3. 系统运行环境:VC+ 6.0, Window 7操作系统平台4. 设计中的重点首先遇到的问题就是套接字文件的问题。套接字所需要的文件有头文件Winsocket2.h、库文件WS2_32.LIB、动态库W32_32.DLL。创建套接字的时候参数的以及在创建套接字之前必须首先使用WSAStartup函数、在使用完套接字之后要释放内存资源,关闭套接字这些问题都是以前未接触过的。所以在写程序的时候需要查阅大量的资料,弄懂这些问题。其次
5、,在套接字问题解决之后,遇到的难题,也是比较重要的问题就是如何实现ICMP报文的发送和接受,以及怎样判断发送、接收超时或者找不到目的主机。最后在程序调试的时候总是出现这样或那样的错误,比如头文件错误、动态库无法导入、编辑器环境不匹配等。四、详细设计 1、本程序主要是通过main()函数调用自定义函数以及其本身的一些功能,例如:打开socket动态库、设置接收和发送超时值、域名地址解析、分配内存、创建及初始化ICMP报文、发送ICMP请求报文、接收ICMP 应答报文以及解读应答报文和输出Ping结果。程序流程图如下:开始 定义及初始化各个全局变量判断WSAStartup函数是否调用成功 否 输出
6、调用失败 是创建套接字以及设置socket接收超时,发送超时选项输入PING的IP地址解析输入内容,设置PING参数创建及填充ICMP数据报文判断输入的ip地址没有-t并且已发四次 是Break 否 清除残余 否发送,接收以及解析数据包结束输出PIING结果2、校验和函数、释放资源函数流程图如下:cleanup开始Checksu开始 if (m_hSocket != INVALID_SOCKE定义初始化cksum(size > 1) 是关闭套接字 否 是 否定cksum及size大小释放占用资源清除ICMP包数据以及接受缓冲区if (size)WSACleanup(); 是cksum+=
7、*(UCHAR*)buffer; 否 结束计算校验cksum,获得结果结束3、ICMP报首部函数流程图如下:DecodeICMPHeader定义相关变量以及初始化tick = GetTickCount()我们所要的回应报文输出不是我们所要tick0icmpcount=tick -icmphdr->timestamp结束判断时间是否小于1msprintf("Reply from %s: dytes=%d time=%d icmp_seq = %dn",inet_ntoa(from->sin_addr)printf("Reply from %s: dyte
8、s=%d time<1ms icmp_seq = %dn",inet_ntoa(from->sin_addr)icmpcount+结束五、程序的结构与分析 运行结果截图如下:结果分析:1、Request timed out(请求超时)(1) 对方已关机,或者网络上根本没有这个地址:比如在上图中Ping 14.150.213.222(2)对方与自己不在同一网段内,通过路由也无法找到对方,但有时对方确实是存在的,当然不存在也是返回超时的信息。(3)对方确实存在,但设置了ICMP数据包过滤(比如防火墙设置)。2、Destination host Unreachable(目标不可
9、达)(1)错误设置IP地址六、课程设计心得体会本次课程设计较好地实现了要求做到的功能,但同时也遇到不少的困难和挑战。通过这次设计,不但加深了对Socket的原始套接字编程的理解,经过实现Ping程序,熟悉了IP、ICMP等,掌握TCP/IP网络协议的基本实现方法。也熟悉了Window网络编程的技术。能熟悉地使用套接字进行网络通信。熟悉了数据通信的网络技术,同时学会了跟同学合作交流完成项目的讨论方法和解决问题的能力。学会如果通过讨论、交流、找资料来独立解决所遇到的问题和不懂。更多地锻炼了独立解决问题的能力。在编写过程中,一些基本的常见的函数不会应用,这使我们小组都发现自己知识的匮乏,在以后的学习
10、过程中得要好好的努力,多阅读一些复杂的程序,了解一个基本的函数,算法和精良的编程思想,更要多动手写一些有一定难度的程序,我们不应该害怕写程序出错,应该大胆地写出自己的想法,出现错误去解决错误就能找出自己知识的漏洞和模糊点。我们还可以通过阅读别人错误的程序,试着帮别人查找错误,这样证书技能头脑中的规则还能发现一些初学者一番的错误,使自己少走弯路。附录一:参考文献【1】 计算机网络 谢希仁编著 电子工业出版社【2】C程序设计 谭浩强编著 北京清华大学出版社附录二:程序源代码及部分注释#include "stdafx.h"#pragma comment(lib,"ws2
11、_32.lib")#include <winsock2.h>/创建套接字头文件#include <ws2tcpip.h>#include <stdio.h>/标准输入输出函数#include <stdlib.h>/实用程序库函数#include <string.h>#include <windows.h>typedef struct iphdr unsigned int h_len:4; / 头长度unsigned int version:4; / IP版本 unsigned char service; / 服务
12、类型 unsigned short total_len; / 包的总长度 unsigned short ident; / 包标示身份 unsigned short frag_and_flags; / 标志 unsigned char ttl; / 包生命周期 unsigned char proto; / 协议类型 unsigned short checksum; / IP 校验 unsigned int sourceIP; /源IP unsigned int destIP; /目标IP IpHeader;#define ICMP_ECHO 8 /ICMP报文类型,回显请求 #define IC
13、MP_ECHOREPLY 0 /ICMP报文类型,回显响应应答#define ICMP_MIN 8 /最小的ICMP数据报大小 typedef struct icmphdr BYTE i_type; /ICMP报文类型 BYTE i_code; /该类型中的代码号 USHORT i_cksum; /校验和 USHORT i_id; /惟一的标识符 USHORT i_seq; /序列号 ULONG timestamp; /时间戳 IcmpHeader;#define DEF_PACKET_SIZE 32 /默认数据报大小#define MAX_PACKET 1024 / 最大的ICMP数据报大小
14、 #define MAX_IP_HDR_SIZE 60 / 最大IP头长度 /初始化全局变量 int datasize=DEF_PACKET_SIZE;char *icmp_data=NULL;char *recvbuf=NULL;SOCKET m_hSocket= INVALID_SOCKET;char *lpdest=NULL;/填充ICMP数据报字段函数void FillICMPData(char *icmp_data, int datasize) IcmpHeader *icmp_hdr = NULL; char *datapart = NULL; icmp_hdr = (IcmpHe
15、ader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_id = (USHORT)GetCurrentProcessId();/GetCurrentProcessId()获取当前进程的标示符(PID) icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader);/校验和函数USHORT checksum(USHORT *buffer, int siz
16、e) unsigned long cksum=0; while (size > 1) cksum += *buffer+; size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(cksum);/解读ICMP报首部函数void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *fr
17、om) IpHeader *iphdr = NULL; IcmpHeader *icmphdr = NULL; unsigned short iphdrlen; DWORD tick; static int icmpcount = 0; iphdr = (IpHeader *)buf;/从buf中获取IP数据包头指针 iphdrlen = iphdr->h_len * 4; tick = GetTickCount(); if (bytes < iphdrlen + ICMP_MIN) printf("Too few bytes from %s rn",inet_
18、ntoa(from->sin_addr); icmphdr = (IcmpHeader*)(buf + iphdrlen);/定位ICMP包头起始位置 if (icmphdr->i_type != ICMP_ECHOREPLY) printf("nonecho type %d received rn", icmphdr->i_type); if (icmphdr->i_id != (USHORT)GetCurrentProcessId() printf("其他程序的回应报文! t错误代码 %dn", WSAGetLastError
19、(); int tick0;tick0=tick - icmphdr->timestamp;if(tick0<1)printf("Reply from%s: bytes=%d time<1ms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes, icmphdr->i_seq );else printf("Reply from %s: bytes=%d time=%dms icmp_seq =%dn",inet_ntoa(from->sin_addr), bytes,tick
20、0, icmphdr->i_seq); /释放资源函数void Cleanup() if (m_hSocket != INVALID_SOCKET) closesocket(m_hSocket); HeapFree(GetProcessHeap(), 0, recvbuf); HeapFree(GetProcessHeap(), 0, icmp_data); WSACleanup();/主函数void main()WSADATA wsaData;char a100;printf("ping ");gets(a);lpdest=a;SOCKADDR_IN m_addrD
21、est;/结构体SOCKADDR_IN m_addrFrom;int timeout=1000;USHORT seq_no=0;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)printf("Sorry, you cannot load socket dll!");m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);/创建原始套接字,该套接字用于ICMP协议 if (m_hSocket = INVALID_
22、SOCKET) /如果套接字创建不成功 printf("socket 创建失败!"); int bread = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout);/设置接收的超时值 if(bread = SOCKET_ERROR) printf("设置socket接收超时选项错误!"); timeout = 1000; bread = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, (char
23、*)&timeout, sizeof(timeout);/设置发送的超时值 if (bread = SOCKET_ERROR) printf("设置socket发送超时选项错误!"); memset(&m_addrDest, 0, sizeof(m_addrDest);/ 用0初始化目的地地址 m_addrDest.sin_family = AF_INET;/设置地址族,这里表示使用IP地址族 if (m_addrDest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)/地址转化 struct hoste
24、nt *hp = NULL; if (hp = gethostbyname(lpdest) != NULL) /名字解析,根据主机名获取IP地址 memcpy(&(m_addrDest.sin_addr), hp->h_addr, hp->h_length);/将获取到的IP值赋给目的地地址中的相应字段m_addrDest.sin_family = hp->h_addrtype; /将获取到的地址族值赋给目的地地址中的相应字段 else printf("不能找到名为 %s 的主机t错误代码 %dn",lpdest, WSAGetLastError(
25、);/获取不成功exit(0); printf("Pinging %s with 64 bytes of data: nn", inet_ntoa(m_addrDest.sin_addr); /inet_ntoa()将网络地址转换成“.”点隔的字符串格式 datasize += sizeof(IcmpHeader); /数据报文大小需要包含ICMP报头/根据默认堆句柄,从堆中分配MAX_PACKET内存块,新分配内存的内容将被初始化为0 icmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACK
26、ET); recvbuf =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET); if (!icmp_data) /如果分配内存不成功 printf("堆分配错误!"); memset(icmp_data,0,MAX_PACKET);/将已开辟内存空间 icmp_data 的首 MAX_PACKET 个字节的值设为值 0。 FillICMPData(icmp_data,datasize);/创建ICMP报文, / 开始发送或接受ICMP包int n
27、Count=0; while(1) int bwrote; if(strstr(a,"-t")=NULL&&nCount+=4) /判断a字符数组中是否包含-t参数并且已发ICMP包4次 break;/超过指定的记录条数则退出 (IcmpHeader*)icmp_data)->i_cksum = 0;/计算校验和前要把校验和字段设置为0 (IcmpHeader*)icmp_data)->timestamp = GetTickCount();/获取操作系统启动到现在所经过的毫秒数,设置时间戳 (IcmpHeader*)icmp_data)->i_seq = seq_no+;/设置序列号 (IcmpHeader*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data, datasize);/计算校
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵阳道路施工方案(3篇)
- 细胞的增殖课件2025-2026学年高一上学期生物人教版必修1
- 2026山东事业单位统考东营市广饶县招聘考试备考题库及答案解析
- 2026广西南宁市横州市总工会招聘社会化工会工作者8人备考考试试题及答案解析
- 2026台州市水利水电勘测设计院有限公司招聘参考考试题库及答案解析
- 2026年济宁微山县事业单位公开招聘初级综合类岗位人员(45人)备考考试试题及答案解析
- 2026河南许昌烟草机械有限责任公司招聘38人考试参考试题及答案解析
- 2026绵阳农商银行寒假实习生招聘备考考试题库及答案解析
- 2026年聊城市第二人民医院“水城优才”青年人才引进参考考试题库及答案解析
- 2026山东大学齐鲁第二医院北院区综合服务中心结算岗位(劳务派遣)补充招聘参考考试题库及答案解析
- 配电网工程施工方案模板
- 港口集装箱运输AGV项目规划设计方案
- YY/T 1919-2023超声造影成像性能试验方法
- 国际私法(鲁东大学)智慧树知到课后章节答案2023年下鲁东大学
- 政府采购评审专家考试试题库-多选及答案(252题)
- 中介服务协议书
- XX服装店股份众筹合伙人制度方案
- 老年人评估量表
- 人教PEP版小学《英语》三年级上册Unit6HappyBirthday!PartB教学设计
- GB/T 3532-2022日用瓷器
- GB/T 22879-2008纸和纸板CIE白度的测定,C/2°(室内照明条件)
评论
0/150
提交评论