版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实用文案课程设计——解析 IP数据包长沙理工大学目录1、课程设计目的....................................................22、课程设计要求....................................................23、程序设计分析.....................................................23.1网卡设置.....................................................23.2.1使用套接字.................................................33.2.2接收数据包.................................................33.3定义IP头部的数据结构........................................43.4IP包的解析..................................................43.5协议的定义...................................................53.6捕获处理.....................................................54、运行结果........................................................65、总结............................................................66、课程设计参考资料................................................77、源程序代码......................................................7标准文档实用文案1、课程设计目的本章课程设计的目的就是设计一个解析 IP数据包的程序,并根据这个程序,明确课程设计的目的和重要性, 认真领会课程设计的题目, 读懂课程设计指导书的要求, 学会设计的基本方法与步骤, 学会如何运用前修知识与收集、 归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成能力拓展训练任务。 设计报告:要求层次清楚,整洁,规范,不得相互抄袭。2、课程设计要求1、用两个线程 a和b来模拟Ethernet 上的两台主机。2、用一个双字类型变量 Bus来模拟总线(将其初始化为“ \0”,并且总线等于“ \0”时表示总线空闲)。3、两个子线程向总线发送自己的数据。数据用该线程的线程号进行模拟,发送数据用线程号和Bus的“或”操作进行模拟(即Bus=Bus|ID,ID为该线程的线程号)。4、每台主机需向总线上成功发送 10次数据,如果其中某次数据发送失败,则该线程结束。5、发送流程必须遵循 CSMA/CD。随即延迟算法中的冲突窗口取 0.005。在数据发送成功 3、程序设计分析3.1网卡设置为了获取网络中的 IP数据包,必须对网卡进行编程,在这里使用套接字(socket) 进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。 对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包, 网络接口在骓投递地址并非自身地址之后将不引起响应, 也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。 使用套接字套接字分为三种,即流套接字 (Streamsocket) 、数据报套接字(DatagramSocket)标准文档实用文案和原始套接字(RawSocket)。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下:Socketsock:Sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_TP,NULL,0,WSA_FLAG_OVERLAPPED);本设计不用考虑超时情况。创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt 函数。其中flag 设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对 IP头进行处理。最后使用 bind()函数将socket绑定到本地网卡上。绑定网卡后,需用 WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的 IP包。 接收数据包在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。3.3定义IP头部的数据结构程序需要定义一个数据结构表示 IP头部。其代码如下:标准文档实用文案inti=0;//发送成功次数intCollisionCounter=16;//冲突计数器初始值为16doubleCollisionWindow=0.005;//冲突窗口值取值0.005intrandNum=rand()%3;//随机数loop:if(Bus==0)//总线空闲{Bus=Bus|ID1; // 模拟发送包Sleep(12);if(Bus==ID1) // 无冲突{printf("%dSendSuccess\n\n",ID1); // 发送成功Bus=0; // 内存清零CollisionCounter=16; // 复原冲突计数器Sleep(rand()%10); // 随即延时i++;printf(" 主机a发送成功次数=%d\n\n",i);if(i<10)goto loop; // 发送次数不够10次,开始下一次发送}else{printf("%dSendCollision\n\n",ID1); // 发生冲突CollisionCounter--;Bus=0 ;
3.4IP 包的解析解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。3.5协议的定义(包含相应的头文件#include#include ):DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/dwProtocol=IPPROTO_IP;/*协议类型为IP*/3.6捕获处理标准文档实用文案加载Winsock;创建一个接收原始IP包的socket连接;绑定到一个接口;进行WSAIoctl设置,接收所有的IP数据包。代码如下:if(WSAIoctl(s,dwIoControlCode,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL)==SOCKET_ERROR)接着设定一个线程进行捕获:1)创建一个接收IP包的链表头;2)设置一个标识,为真,则不断进行IP包的捕获;3)建立一个新的结点,将捕获的数据包加入到该结点;4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;5)为下一个IP包链表创建一个链表头。建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。4、运行结果截获IP数据包程序运行结果如下:标准文档实用文案5、总结这次计算机网络课程设计是解析 IP数据包,通过这次上机充分应用了所学的计算机网络和 C语言的知识,并上网搜索一部分相当资料,粗略设计出该程序。通过本次课程设计,首先认识到了自己的不足。在编码的过程中认识到了自己细节方面的不足,在以后计算机网络的学习过程中在理解的同时还要做到对细节的注重; 当然在本次课设中最终还是实现了题目要求。同时,觉得本次课设是十分有意义的,使自己所学的只是有了实践的地方。6、课程设计参考资料《计算机网络(第四版)》 主编:谢希仁 出版社:电子工业出版社 出版时间:2004年7月《计算机网络课程设计》 主编:吴功宜 胡晓英张仁何云王宁出版社:机械工业出版社标准文档实用文案出版或修订时间:2005年9月《计算机网络设计》主编:易建勋 出版社:人民邮电出版社 出版或修订时间:2007年10月7、源程序代码#include"winsock2.h"#include"ws2tcpip.h"#include"iostream"#include"stdio.h"#pragma comment(lib,"ws2_32.lib")typedefstruct_IP_HEADER// 定义IP头{union{BYTEVersion; // 版本(前4位)BYTEHdrLen; //IHL (后4位),报头标长};BYTEServiceType; // 服务类型WORDTotalLen; // 总长WORDID; // 标识union{WORDFlags; // 标志(前3位)WORDFragOff; // 分段偏移(后13位)};BYTETimeToLive; // 生命期BYTEProtocol; // 协议WORDHdrChksum; // 头校验和DWORDSrcAddr; // 源地址标准文档实用文案DWORDDstAddr; // 目的地址BYTEOptions; // 选项}IP_HEADER;逐位解析IP头中的信息voidgetVersion(BYTEb,BYTE&version){version=b>>4; // 右移4位,获取版本字段}voidgetIHL(BYTEb,BYTE&result){result=(b&0x0f)*4; // 获取头部长度字段}char*parseServiceType_getProcedence(BYTEb){switch(b>>5) // 获取服务类型字段中优先级子域{case7:return"NetworkControl";break;case6:return"InternetworkControl";break;case5:return"CRITIC/ECP";break;case4:return"FlashOverride";break;case3:return"Flsah";break;标准文档实用文案case2:return"Immediate";break;case1:return"Priority";break;case0:return"Routine";break;default:return"Unknow";break;}}char*parseServiceType_getTOS(BYTEb){b=(b>>1)&0x0f; // 获取服务类型字段中的 TOS子域switch(b){case0:return"Normalservice";break;case1:return"Minimizemonetarycost";break;case2:return"Maximizereliability";break;#include<unistd.h>#include<stdio.h>#include<sys/wait.h>#include<sys/ipc.h>标准文档实用文案#include<sys/shm.h>#include<sys/types.h>#include<error.h>#include<time.h>#include<stdlib.h>#defineERROR_SHMGET-1#defineERROR_SHMAT-2#defineERROR_WAIT-3#defineERROR_FORK-4#defineSLOT_TIME0.005/*截止二进制指数退避算法的实现该算法可以表示为:t=2*τ*r为结点重新发送需要的后退延迟时间;2*τ为冲突窗口值;r为随机数,r的取值范围为[0,2^k-1],k=Min[重传次数,10];当重传16次仍不成功时,则丢弃该帧.*/staticunsignedlongget_backoff(constintn)//计算重传推迟时间{intk=n;k=16-k;if(k>10)// 如果重传次数大于 10时,重传次数置为10k=10;return(random()%(1<<k))*SLOT_TIME;// 返回重传推迟时间}/*发送数据流程*/staticvoidsend_msg(constvoid*addr,constpid_tpid,charch){pid_t*bus=(pid_t*)addr;intcollision;// 冲突计数器intk=0;//发送成功的次数for(inti=0;i<10;i++){collision=16;do{while(*bus!=0);//总线不空闲,循环等待直到总线空闲.usleep(SLOT_TIME/2);//检测到总线为空闲时就开始发送数据,因为线程A和B共享总线变量bus,所以在τ时间以内,另一个线程收不到数据,所以要进行此操作*bus|=pid;//表示另一个进程受收到模拟数据.usleep(SLOT_TIME/2);//从模拟数据发送后经过2τ时间之后进行判断.判断是否冲突,共享内存与写入内存比较,若相同则无冲突,否则发生冲突.if(*bus!=pid){*bus=0;// 复原总线为0标准文档实用文案collision--;if(collision>0){printf("%dsendcollision.\n",pid);usleep(get_backoff(collision));//随机延时}else{printf("%dsendfailure.\n",pid);//发送失败break;}}else{*bus=0;break;}}while(1);if(collision>0){k++;printf("%dsendsuccess.\n",pid);printf("%csendsuccess=%d.\n",ch,k);}usleep(random()%1024);}}/*主函数*/intmain(){pid_tpid=0;intbus=0;/*共享内存的ID,用来模拟总线*/void*addr=0;/*指向模拟总线的首地址*/bus=shmget(IPC_PRIVATE,sizeof(pid_t),SHM_R|SHM_W);//获取共享内存if(bus==-1)/*如果申请内存失败*/{perror("shmgeterror.");returnERROR_SHMGET;}if((pid=fork())<0)// 创建子进程a{perror("forkerror.");标准文档实用文案returnERROR_FORK;}elseif(pid==0){pid=getpid();// 获取子进程IDaddr=shmat(bus,0,0);// 初始化共享内存为 \0if(addr==(void*)-1){perror("shmaterror");/*shmctl(shmid,IPC_RMID0)是释放共享内存区,shmid,,这只有在所有进程中的都已经无效化后才会进行IPC_RMID0)如果shmid0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 庄重保证书承诺的严肃宣示
- 合同范本税务代理合同范例
- 合同服务期限的期限解除
- 房产销售代理权合同
- 软件开发合同协议样本
- 热电锅炉房施工招标要求
- 房产交易合同担保书
- 皮鞋销售购销合同格式
- 金融担保合同协议范例
- 购销水泥合同
- NB∕T 10731-2021 煤矿井下防水密闭墙设计施工及验收规范
- 反求工程基础课件
- 中式烹调技艺烹饪专业基础试题及其参考答案
- 【培训课件】用电安全知识
- 超星学习通垃圾分类知识章节测试题(含答案)
- 慢性阻塞性肺疾病(-COPD)的药物治疗及合理用药课件
- 人工智能技术介绍完整版人工智能概述、围棋课件
- 事故油池施工方案交底
- 六年级上册美术课件-10 流动的风景线 |浙美版(2014秋)(共13张PPT)
- 参保人员人事档案及视同缴费年限核查认定申请表
- JJF(苏) 179-2015 风量仪校准规范-(现行有效)
评论
0/150
提交评论