网络协议编程课程设计.doc

上传人:laozhun 文档编号:2386151 上传时间:2023-02-17 格式:DOC 页数:15 大小:189KB
返回 下载 相关 举报
网络协议编程课程设计.doc_第1页
第1页 / 共15页
网络协议编程课程设计.doc_第2页
第2页 / 共15页
网络协议编程课程设计.doc_第3页
第3页 / 共15页
网络协议编程课程设计.doc_第4页
第4页 / 共15页
网络协议编程课程设计.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《网络协议编程课程设计.doc》由会员分享,可在线阅读,更多相关《网络协议编程课程设计.doc(15页珍藏版)》请在三一办公上搜索。

1、网络协议编程课程设计指导教师: 学生班级: 网络10802 学生姓名: 学 号: 班内序号: 21 课设日期:2011/7/52011/7/12 目 录一、课程设计目的与任务3二、设计任务及要求31、RAW模式的SOCKET编程32、具体内容3三、需求分析4四、总体设计(流程图)5五、详细设计与实现6六、实现结果及结果分析11七、使用说明14八、课设小结14一、课程设计目的与任务网络协议编程课程设计是学习TCP/IP协议分析课程后的一个重要实践环节,是对学生进行的一次较为全面的网络协议分析应用程序设计训练。其基本目的是:(1)培养学生理论联系实际的设计思想,训练综合运用所学的基础理论知识,结合

2、生产实际分析和解决网络应用中基本问题的能力,从而使基础理论知识得到巩固和加深。(2)训练学生运用软件工程的原理、方法和工具完整地设计并开发一个网络应用系统,历练软件工程常规设计过程和基本方法。为将来的实际应用开发打好基础。(3)深层次掌握TCP/IP协议的基本原理与数据格式。(4)熟悉并掌握网络通信协议Socket编程的方法。 二、设计任务及要求1、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、

3、BIND等。2、具体内容1) 定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构2) 程序实现在WINDOWS环境下实现PING程序3) 程序要求在窗体文本框中输入: PING .其中为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息显示在窗体上: REPLY FROM .或 REQUEST TimeOut (无法PING通的情况) (3)实验步骤和注意事项1、 熟悉IP以及ICMP协议的工作机制2、 熟悉RAW模式的SOCKET编程3、 编写PING的实现程序4、 编译环境中需要包括SOCKET库 WS2_32.lib5、

4、 在模拟实现环境下调试并运行自己编写的PING程序三、需求分析在带界面的PING程序中最基本的需要是用以输入IP的文本框,显示reply的文本框和几个基本按钮。这个要事先知道在PING .后的reply要返回哪些内容,上面已经要求返回4次响应,每次相应的reply就以我们平时在doc下ping的结果为模板REPLY FROM .:Bytes=XX TTL=XXX Time=XXms.虽然要求为目的主机的IP地址,不要求支持域名但域名的转换还是蛮简单的固定代码就加上去了。也添加了两个清空的按钮以便于用户使用。四、总体设计(流程图)A ping B结 束将ICMP封装到IP数据报中并发送给B计算校

5、验和、获取ip封装ICMP接受B的回复判断接受字节数是否为0解析收到的报文核实收到的ID号和发送的是否一致丢弃返回目地IP、字节数、TTL值、时间戳是否不一致一致五、详细设计与实现1.用vc新建一个MFC对话框工程,从控件中拖入静态文本右击属性修改id和标题,类似的再拖入其他的编辑框和按钮,在显示reply的编辑框的属性中要勾选只读,这样既可以无法修改reply又可以节省复制粘贴的代码。在界面大致完成的时候界面如下: 图一:完成界面结构因为默认的是白色所以在Initlnstance()中添加SetDialogBkColor (RGB (128, 184, 223), RGB ( 0, 0 ,

6、150 ) );使得界面的背景色变为蓝色。 图二:改变背景BOOL CPingApp:InitInstance()SetDialogBkColor (RGB (128, 184, 223), RGB ( 0, 0 , 150 ) );觉得通用的.ico图片不是我想要的便换了一张。在此时运行得到的界面效果是: 图三:没有任何的功能的蓝色界面效果2.接下来就是在.cpp文件中添加相应的代码以实现老师和自己的要求。首先是定义ip和icmp 的首部,这些代码是固定的所以直接复制粘贴了。typedef struct ip_hdr /定义IP首部 unsigned char h_verlen; /4位首部

7、长度,4位IP版本号 unsigned char tos; /8位服务类型TOS unsigned short total_len; /16位总长度(字节) unsigned short ident; /16位标识 unsigned short frag_and_flags;/3位标志位 unsigned char ttl; /8位生存时间 TTL unsigned char proto; /8位协议 (TCP, UDP 或其他) unsigned short checksum; /16位IP首部校验和 unsigned int sourceIP; /32位源IP地址 unsigned int

8、 destIP; /32位目的IP地址 IP_HEADER; typedef struct icmp_hdr BYTE i_type; / ICMP报文类型 BYTE i_code; / ICMP代码 USHORT i_cksum; / 校验和 USHORT i_id; / 标志符 USHORT i_seq; / 序号 ULONG timestamp; / 时间戳 ICMP_HEADER;3.初始化void CPingDlg:OnPing() /初始化/ TODO: Add your control notification handler code hereint rect; WSADATA

9、 WSAData; if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0 ) printf (WSAStartup Error!n); /如果初始化不成功则报错exit(0); SOCKET sock4; for(int i=0; i h_addr_list0); ICMP_HEADER icmpHeader; SOCKADDR_IN addr_in,addr_from; char recvbuf1024; socki= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); int nTimeOut = 1000; /超时毫秒/设

10、置发送超时和接收超时setsockopt(socki, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOut, sizeof(nTimeOut); setsockopt(socki, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, sizeof(nTimeOut); memset(&addr_in, 0, sizeof(addr_in); addr_in.sin_family = AF_INET; /为网络地址类型,一般为AF_INETaddr_in.sin_addr.S_un.S_addr = inet_addr(ip);

11、/IP/设置数据报头memset(&icmpHeader, 0, sizeof(icmpHeader); icmpHeader.i_type = 8; icmpHeader.i_code = 0; icmpHeader.i_cksum = 0; icmpHeader.i_id = (USHORT)GetCurrentProcessId(); icmpHeader.i_seq = 0; icmpHeader.timestamp = GetTickCount(); icmpHeader.i_cksum = checksum(USHORT*)&icmpHeader, sizeof(icmpHeade

12、r); /发送一个icmpHeaderrect = sendto(socki, (char*)&icmpHeader, sizeof(icmpHeader), 0, (sockaddr*)&addr_in, sizeof(addr_in); int addr_from_len; addr_from_len = sizeof(addr_from); /接收的数据报为IP头+ICMP头rect = recvfrom(socki, recvbuf, sizeof(recvbuf), 0, (sockaddr*)&addr_from, &addr_from_len);/rect为接收的字节数 if(r

13、ect0)/正确就调用DecodeHeader输出DecodeHeader(recvbuf, rect); else CString reply=REQUEST TimeOut!;SetDlgItemText(IDC_REPLY,reply);closesocket(socki); WSACleanup(); 用于初始化各个全局变量,为全局变量赋初始值;初始化,加载库。定义一个Cstring reply用以输出。例如当超时时便输出REQUEST TimeOut!CString reply=REQUEST TimeOut!;SetDlgItemText(IDC_REPLY,reply);域名转换

14、:hostent *hp=gethostbyname(ip);/域名转换成IPif(hp!=NULL)ip=inet_ntoa(*(struct in_addr*)hp- h_addr_list0); 4.在CDlg中添加函数USHORT CPingDlg:checksum(USHORT *buffer, int size) 图四:添加cheksum()函数checksum()函数用于计算校验和。计算过程是首先把数据报头中的校验和字段设置为0,然后对首部中每个16bit 进行二字段进制反码求和(整个首部看成是由一串16bit的字组成),结果存在校验和字段中。其中buffer 用于存放ICMP数

15、据,size表示ICMP报文大小。USHORT CPingDlg:checksum(USHORT *buffer, int size)unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) /若size为奇数 cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); 5.添加函数void CPingDlg:Decode

16、Header(char *buf, int len)解读报头函数在初始化中if(rect0)DecodeHeader(recvbuf, rect); 即正确时就调用DecodeHeader输出 if (icmpHeader-i_id != (USHORT)GetCurrentProcessId() /核实收到的ID号和发送的是否一致 printf(someone elses packet!n);return; CString reply;reply.Format(Reply from %s: Bytes= %d TTL = %d Time= %d ms.rn, inet_ntoa(addr),

17、 len, ipHeader-ttl, Time1-icmpHeader-timestamp);m_reply+=reply;SetDlgItemText(IDC_REPLY,m_reply+ping is complete!);/Sleep(500);6.添加自己加上去的小函数重置:因为输入ip/域名的id设为了IDC_IP所以GetDlgItem(IDC_IP)-SetWindowText();便可以实现重置ip/域名六、实现结果及结果分析在运行后产生.exe文件双击此文件便可运行。1.用本机测试: Ping 127.0.0.1TTL即为生存值,每经过一个路由器值便减少1,因为127.0.

18、0.1为本机所以没有经过任何一个路由器,故为最大值128,Time为时间戳,在本机变为0.2.在断网时无法访问百度故抛出异常 Ping 3.联网时 Ping 要访问百度用的是域名,先经过转换为ip。因为访问百度必然是要经过路由器所以TTL值小于128,时间戳也会不一样。4.重置 当不想ping这个ip或者域名时单击这个“重置”按钮。七、使用说明直接在“ip/域名:”后面的编辑框中输入ip或者域名,点击“ping”按钮即可在下面只读的蓝色编辑框中显示回复的信息。如果不想ping某一个ip或者域名可以点击“重置”键可再次输入ip或者域名。因为清空键(clear)的设置问题貌似是实现了清空但在没有关

19、闭的情况下上一次的显示结果在下一次还是会再次显示。八、课设小结 TCP/IP这门课程是我们的一门必修课,以前写代码差不多都是用在制作网页上,这次用来实现以前常用的DOC相似的功能感觉很不一样啊。VC也是在大一时就接触的,但是用的不是很多也不是很熟,要用它制作界面还是现学现卖的,好在感觉和用DW制作网页差不多。同学中也有使用的非常熟练的,自己摸索加上同学的帮助自然是比自己瞎撞来的容易。要实现ping首先要了解整个的流程。在查找了很多的相关源代码后,知道了要用到ip icmp首部,要初始化,校验和,控制,判断后按照要求输出。实际运用和在课本上硬记报文格式和定义是非常不同的,当自己运用制作时感觉这是

20、自己的东西,除了要明白原来是这么回事外还要更加清楚这里面的细节,灵活运用。这次选择了认为最简单的一提,由于自己的能力时间有限暂时就是这样的,当然,对自己的这个制作作品还是很有意见的,还有很多的地方可以改进,例如:色调可以更加鲜艳和谐,可以添加背景音乐,添加显示所ping的ip所经过的路由,还可以加上丢包率,但是因为时间问题修改后截图也要修改,已经加上去的clear函数可以实现的更加符合要求,现在用的这个函数看上去是实现了清空的功能但只要不是关掉重新打开再次ping时上次被“clear”的内容会再次出现,所以在实现结果里没有说明这一功能也没有截图。在这次的课设中,毫不意外的又学到了不少新的东西,也再次了解到向他人请教学习的必要性。受益匪浅。指导老师意见: 成绩: 教师签名: 年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号