ip数据报解析源地址目的地址
路由器转发原理

路由器转发原理
路由器转发原理是指路由器根据IP数据报的源IP地址和目的IP地址,从路由表中寻找最佳的路径,通过转发器设备将数据报按照此路径传送出去,这个过程也叫路由转发。
实现:
1. 路由器计算机识别网络传输数据报,并且使用指定的IP地址路由表根据传输数据报的源IP地址和目的IP地址,通过算术运算寻找最佳的路径传输。
2. 根据最优的路径,从传输数据报中提取出目的IP地址信息或源IP地址信息,将数据按照此路径转发至目的IP计算机。
3. 在源IP计算机向目的IP计算机传输数据报之前,源IP计算机发出一条ARP (地址解析协议)请求,源IP计算机将得到通过路由器和目的IP计算机网段上的响应,如果响应可以匹配,则证明连接有效,路由器就可以转发数据报了。
4. 如果响应不可以匹配,路由器将持续转发该请求,直到得到有效的响应,才
能完成路由转发。
ip数据报解析源地址目的地址

青岛农业大学理学与信息科学学院计算机网络综合实习报告题目IP数据报解析源地址/目的地址专业计算机科学与技术学号姓名指导教师日期2014年11月8日目录一、设计任务和目的............................................................................................................................. - 2 -二、设计要求......................................................................................................................................... - 2 -三、设计内容......................................................................................................................................... - 3 -3.1原理概述: ......................................................................................................................................... - 3 -3.1.1 点分十进制表示法:......................................................................................................... - 3 -3.1.2 IP数据报格式: .............................................................................................................. - 3 -3.2 运行结果及分析............................................................................................................................. - 5 -3.2.1程序运行及截图.................................................................................................................. - 5 -3.2.2 分析...................................................................................................................................... - 6 -四、设计方案改进及建议.................................................................................................................... - 7 -五、总结体会......................................................................................................................................... - 7 -六、主要参考文献................................................................................................................................. - 8 -七、附录 ................................................................................................................................................. - 8 -附录1 程序流程图 ............................................................................................................................... - 8 - 附录2 程序源代码及解释................................................................................................................... - 9 -一、设计任务和目的设计一个解析IP数据包的程序,并根据这个程序,从IP数据报头中解析出源地址和目的地址等相关问题,从而对IP层的工作原理有更好的理解和认识。
TCP IP协议体系结构简介

TCP/IP协议体系结构简介TCP/IP协议体系结构简介1、TCP/IP协议栈四层模型TCP/IP这个协议遵守一个四层的模型概念:应用层、传输层、互联层和网络接口层。
网络接口层模型的基层是网络接口层。
负责数据帧的发送和接收,帧是独立的网络信息传输单元。
网络接口层将帧放在网上,或从网上把帧取下来。
互联层互联协议将数据包封装成internet数据报,并运行必要的路由算法。
这里有四个互联协议:网际协议IP:负责在主机和网络之间寻址和路由数据包。
地址解析协议ARP:获得同一物理网络中的硬件主机地址。
网际控制消息协议ICMP:发送消息,并报告有关数据包的传送错误。
互联组管理协议IGMP:被IP主机拿来向本地多路广播路由器报告主机组成员。
传输层传输协议在计算机之间提供通信会话。
传输协议的选择根据数据传输方式而定。
两个传输协议:传输控制协议TCP:为应用程序提供可*的通信连接。
适合于一次传输大批数据的情况。
并适用于要求得到响应的应用程序。
用户数据报协议UDP:提供了无连接通信,且不对传送包进行可*的保证。
适合于一次传输小量数据,可*性则由应用层来负责。
应用层应用程序通过这一层访问网络。
网络接口技术IP使用网络设备接口规范NDIS向网络接口层提交帧。
IP支持广域网和本地网接口技术。
串行线路协议TCP/IPG一般通过internet串行线路协议SLIP或点对点协议PPP在串行线上进行数据传送。
(是不是我们平时把它称之为异步通信,对于要拿L INUX提供建立远程连接的朋友应该多研究一下这方面的知识)?2、ARP要在网络上通信,主机就必须知道对方主机的硬件地址(我们不是老遇到网卡的物理地址嘛)。
地址解析就是将主机IP地址映射为硬件地址的过程。
地址解析协议A RP用于获得在同一物理网络中的主机的硬件地址。
解释本地IP地址(要了解地址解析工作过程的朋友看好了)主机IP地址解析为硬件地址:(1)当一台主机要与别的主机通信时,初始化ARP请求。
ipv4报文格式解析

ipv4报文格式解析IPv4报文格式如下:1. 版本号(Version):占4位,表示IP协议的版本。
目前广泛使用的是IPv4,其版本号为0100。
2. 首部长度(Header Length):占4位,表示IP首部的长度。
首部长度单位为32位字长(4字节),4位二进制表示最大的十进制数值为15,因此,当首部长度为1111时(即十进制的15),首部长度达到最大长度60字节。
通常情况下,首部长度为20字节。
3. 区分服务(Type of Service):占8位,用于表示数据包的服务质量,如延迟、吞吐量、可靠性和成本等。
现在通常使用3位优先级字段和5位TOS字段。
4. 总长度(Total Length):占16位,表示整个IP数据包的长度,包括首部和数据部分。
范围为0-65535字节。
5. 标识(Identification):占16位,用于标识数据包。
当原始报文超过最大传输单元(MTU)时,需要进行分片,每个分片打上相同的标识符,以便接收端识别为同一个报文的分片。
6. 标记(Flags):占3位,用于表示数据包是否分片以及分片顺序。
其中,第一位未使用;第二位表示“不允许分片”(Don't Fragment,DF),第三位表示“更多分片”(More Fragments,MF)。
7. 分片偏移量(Fragment Offset):占13位,用于标记分片在分组中的位置。
8. 生存时间(Time to Live,TTL):占8位,表示数据包可以在网络中传输的最大跳数。
9. 协议(Protocol):占8位,表示传输层使用的协议类型,如ICMP、IGMP、TCP、UDP等。
10. 头部校验和(Header Checksum):用于校验IP报头的正确性,仅校验头部,数据部分由传输层协议负责校验。
11. 源IP地址(Source IP Address):占32位,表示数据包的源IP 地址。
12. 目的IP地址(Destination IP Address):占32位,表示数据包的目的IP地址。
ipip隧道协议报文格式

ipip隧道协议报文格式本文将为大家介绍ipip隧道协议报文格式。
隧道协议指的是一种在网络层进行连接的协议,其目的是为了在不同网络之间建立通信的链路。
ipip隧道协议报文格式主要包括源IP地址、目的IP地址、协议类型、报文长度和数据部分。
下面将逐一介绍每个字段的含义和格式。
1. 源IP地址:该字段用来指示报文的来源IP地址,通常以32位的二进制形式表示,如192.168.1.1。
源IP地址的作用是用来标识报文的发送方。
2. 目的IP地址:该字段用来指示报文的目的IP地址,也以32位的二进制形式表示。
目的IP地址的作用是用来标识报文的接收方。
3. 协议类型:该字段用来指示报文所使用的协议类型,如TCP、UDP等。
协议类型通常以数字形式表示,例如TCP对应的协议类型为6,UDP对应的协议类型为17。
4. 报文长度:该字段用来指示报文的总长度,以字节为单位。
报文长度的值应包括报头和数据部分的长度。
5. 数据部分:该字段包含了报文的实际数据内容,可以根据具体的需求进行定义。
数据部分可以包含任意长度的信息,根据使用的协议类型和应用场景的不同,数据部分的格式和内容也会有所不同。
在ipip隧道协议中,报文的格式通常采用固定长度的报头和可变长度的数据部分。
报文的长度和字段的顺序是固定的,这样接收方可以根据报文格式来正确解析和处理报文。
总结一下,ipip隧道协议报文格式包括源IP地址、目的IP地址、协议类型、报文长度和数据部分。
通过这些字段的组合,可以实现网络间的通信和数据传输。
在实际应用中,可以根据具体的需求和协议类型来定义报文的格式和内容,以满足不同的业务需求。
希望本文对大家理解ipip隧道协议报文格式有所帮助。
如果还有其他疑问或需求,请随时在评论区留言。
以太帧及IP相关报文分析

以太帧及IP相关报文分析以太帧(Ethernet Frame)和IP(Internet Protocol)相关报文是计算机网络中最基础且重要的数据传输单位。
本文将从以下几个方面对以太帧和IP报文进行分析。
一、以太帧以太帧是以太网中数据传输的基本单位,由目的MAC地址、源MAC地址、以太类型/长度、数据字段和帧校验序列构成。
1.目的MAC地址和源MAC地址:2.以太类型/长度:以太类型字段用于指示以太帧中封装的数据的协议类型,例如IP协议、ARP协议等。
当以太类型字段的值为小于或等于1500时,这个值表示数据字段的长度,即以太帧中封装的数据长度;当以太类型字段的值大于1500时,这个字段被称为以太类型,表示封装的数据是什么类型的协议。
3.数据字段:数据字段是以太帧中封装的实际数据,如IP报文、ARP报文等。
数据字段的长度可变,具体长度由以太类型字段指示。
4.帧校验序列:帧校验序列用于检验以太帧在传输过程中是否出现错误。
发送端在发送数据前会计算校验和,并将校验和值附加到帧的最后。
接收端在接收到数据后也会进行计算,如果计算结果与接收到的校验和不一致,则表明数据在传输过程中发生了错误。
二、IP报文IP报文是基于IP协议进行数据传输的基本单位,由IP头部和数据部分构成。
1.IP头部:IP头部包含了多个字段,用于指示数据传输的相关信息。
-版本:指示IP协议的版本,通常为IPv4或IPv6-首部长度:指示IP头部的长度,以32位字长为单位。
-区分服务:指示数据传输的优先级和服务质量要求。
-总长度:指示IP报文的总长度,包括IP头部和数据部分的长度。
-标识、标记和片偏移:用于支持IP分片,当数据包过大时,可以进行分片以适应网络传输。
-生存时间(TTL):表示IP报文在网络中可以经过的最大路由器跳数。
-协议:指示IP报文的上层协议类型,如TCP、UDP等。
-校验和:用于检验IP头部在传输过程中是否出现错误。
-源IP地址和目的IP地址:指示IP报文的源地址和目的地址。
任务三计算机网络试验IP数据报捕获与分析

任务三网络编程一、实验目的捕获本机网卡的IP包,对捕获的IP包进行解析。
要求必须输出以下字段:版本号、总长度、标志位、片偏移、协议、源地址和目的地址。
二、实验环境平台:Windows编程环境:VC 6.0语言:C++三、实验原理3.1 数据报格式以太帧由一个包含三个字段的帧头开始,前两个字段包含了物理地址,各六个字节,头部的第三个字段包含了 16 位的以太帧类型,帧头后面是数据区。
根据帧类型可以判断是哪种数据包,一般常用的有 0X0080(IP 数据包)、0X0806(ARP 请求/应答)和 0X8035(RARP 请求/应答)三种类型。
TCP/IP 协议簇中位于网络层的协议,也是最为核心的协议。
所有的 TCP, UDP, ICMP及 IGMP 数据都以 IP 数据报格式传输。
IP 协议提供了无连接的、不可靠的数据传输服务。
同时IP 协议的一个重要功能是为网络上的包传递提供路由支持。
TCP/IP 协议使用 IP 数据报这个名字来指代一个互联网数据包。
IP 数据报由两部分组成,前面的头部和后面的数据区,头部含有描述该数据报的信息,包括源 IP 地址和目的 IP 地址等。
在 IP 数据报的报头中的众多信息可根据协议类型字段区分出该数据包的类型,常用的有TCP 包、 UDP 包、 ICMP 包等,各格式分别如下所示:IP数据报格式TCP数据报格式ICMP数据报格式数据报格式UDP.3.2 捕获数据包方法目前常用的捕获数据包的方法有原始套接字、LibPcap、WinPcap和JPcap等方法。
本次实验选用套接字方法。
套接字是网络应用编程接口。
应用程序可以使用它进行网络通信而不需要知道底层发生的细节。
有时需要自己生成一些定制的数据包或者功能并希望绕开Socket提供的功能,原始套接字(RawSocket)满足了这样的要求。
原始套接字能够生成自己的数据报文,包括报头和数据报本身的内容。
通过原始套接字,可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。
路由器转发IP数据报的基本过程

路由器转发IP数据报的基本过程1. 路由器的基本概念和作用路由器是一种网络设备,用于在不同网络之间传输数据。
它可以根据网络地址将数据从源地址转发到目的地址。
路由器是网络中的交通警察,负责决定数据的最佳路径并转发数据包。
2. IP数据报的基本结构IP数据报是在网络中传输的基本单位,它包含了源地址、目的地址、数据内容和其他控制信息。
IP数据报的基本结构如下:•版本:标识IP协议的版本,通常为IPv4或IPv6。
•头部长度:指示IP数据报头部的长度。
•服务类型:用于指定数据报的服务质量要求。
•总长度:指示整个IP数据报的长度。
•标识、标志和片偏移:用于分片和重组IP数据报。
•生存时间:指示数据报在网络中可以存活的时间。
•协议:指示IP数据报的上层协议,如TCP、UDP等。
•头部校验和:用于检测IP数据报头部的错误。
•源地址:发送IP数据报的源主机的IP地址。
•目的地址:接收IP数据报的目的主机的IP地址。
•选项:可选字段,用于提供一些附加的功能。
3. 路由器的转发过程路由器的转发过程是指将收到的IP数据报从一个接口转发到另一个接口的过程。
下面是路由器转发IP数据报的基本过程:步骤1:接收数据报路由器从一个接口接收到来自源主机的IP数据报。
步骤2:检查目的地址路由器检查IP数据报的目的地址,以确定数据报的最终目的地。
步骤3:查找路由表路由器使用路由表来决定将数据报转发到哪个接口。
路由表是路由器的重要组成部分,它记录了网络地址与接口之间的映射关系。
步骤4:选择最佳路径路由器根据路由表中的信息选择最佳路径,以确保数据报能够快速、安全地到达目的地。
最佳路径通常是根据距离、带宽和网络拥塞等因素来确定的。
步骤5:转发数据报路由器将数据报从源接口转发到目的接口。
在转发过程中,路由器会根据目的地址修改数据报的目的MAC地址,并重新计算IP数据报的校验和。
步骤6:发送数据报路由器将修改后的数据报发送到下一个接口,继续转发到下一个路由器或目的主机。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ip数据报解析源地址目的地址青岛农业大学理学与信息科学学院计算机网络综合实习报告题目IP数据报解析源地址/目的地址专业计算机科学与技术学号姓名指导教师日期2014年11月8日目录一、设计任务和目的 .............................................. - 2 -二、设计要求 .......................................................... - 2 -三、设计内容 .......................................................... - 2 -3.1原理概述: ................................................... - 2 -3.1.1 点分十进制表示法:..................... - 2 -3.1.2 IP数据报格式:.......................... - 2 -3.2 运行结果及分析........................................ - 4 -3.2.1程序运行及截图.............................. - 4 -3.2.2 分析................................................. - 5 -四、设计方案改进及建议 ...................................... - 5 -五、总结体会 .......................................................... - 6 -六、主要参考文献 .................................................. - 6 -七、附录 .................................................................. - 6 -附录1 程序流程图.......................................... - 6 - 附录2 程序源代码及解释.............................. - 8 -一、设计任务和目的设计一个解析IP数据包的程序,并根据这个程序,从IP数据报头中解析出源地址和目的地址等相关问题,从而对IP层的工作原理有更好的理解和认识。
通过实际操作,加深对计算机网络的理解,了解计算机网络应用的灵活性,加深对IP数据报格式的了解,点分十进制理解,巩固所学习的C语言。
二、设计要求编写计算机程序,从网络捕获数据包,从IP数据报头中解析出源地址和目的地址,将它们以点分十进制形式输出。
三、设计内容3.1原理概述:3.1.1 点分十进制表示法:对主机或路由器来说,ip地址都是32位的二进制代码,为了提高可读性,我们常常把32位的ip地址中的每8位用其等效的十进制数字表示,并且在这些数字之间加上一个点,这就叫做点分十进制表示法(dotted decimal notation)。
例如:一个ip地址:100000000 00001011 00000011 00011111 用点分十进制表示为:128.11.3.31读起来要方便得多。
3.1.2 IP数据报格式:IP协议所处理的数据单元称为IP数据报。
其格式如下:图3-1 数据报格式图[1]IP数据报由首部和数据两部分组成,首部又分为定长部分和变长部分。
◆版本(VER):4位,表示数据报的IP协议版本,当前的IP协议版本号为4,即IPv4;下一代网络协议IPv6,版本号为6.◆首部长度(HLEN):4位,表示以字长(4字节)为单位的数据报首部长度。
◆服务类型(SERVICE TYPE): 8位,规定本数据报的处理方式。
前三位是优先级,0-7,0表示最低,7最高(最重要),但目前的IPv4没有使用优先级。
后4位是TOS,表示本数据报在传输过程中所希望得到的服务,D--最小延迟(minimize delay);T--最大吞吐率(maximize throughout);R--最高可靠性(maximize reliability);C--最低成本(minimize cost)。
值得注意的有2点:①服务类型代表用户的希望,并不具有强制性,目前许多设备TCP/IP中不支持服务类型特性。
②在D、T、R、C这4个参数中只能设置其中一个。
◆数据报总长度:在IP数据报封装到以太网帧中进行传输时很有用.◆标识(IDENTIFICATION):16位每个IP数据报都有一个本地唯一的标识符,它由信源机赋予IP数据报。
每次自动加1.◆标志(FLAGS):3位,表示该IP数据报是否允许分片以及是否最后一片。
◆片偏移(FRAGMENTATION OFFSET):表示本片数据在他所属原始数据报数据区的偏移量。
◆生存时间(time to live,TTL): 8位,◆协议(PROTOCOL):8位,指明被IP数据报封装的协议:ICMP=1,IGMP=2,TCP=6,EGP=8,UDP=17,OSPF=89.◆首部校验和(HEADER CHECKSUM):16位,保证首部数据完整性。
◆源IP地址(SOURCE ADDRESS):32位(IPv4中),发送方源地址。
◆目的地址(DESTINATION ADDRESS): 32位(IPv4中),最总接收方IP地址。
◆IP选项(IP OPTIONS):变长字段,传输数据报时的附加功能。
本实验的功能主要是实现将32位的二进制表示成十进制数图3-2 IP组成结构图[2]3.2 运行结果及分析3.2.1程序运行及截图图3-2-1 程序运行图图3-2-2 运行结果图3.2.2 分析IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
对于IPv4,4位版本字段是4。
4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
总长度是整个数据报(包括IP首部和IP 层payload)的字节数。
每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。
3位标志和13位片偏移用于分片。
TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
协议字段指示上层协议是TCP、UDP、ICMP还有IGMP。
然后是校验和,只校验IP首部,数据的校验由更高层协议负责。
IPv4的IP地址长度为32位。
选项字段的解释从略。
四、设计方案改进及建议首先理解点分十进制表示方法的运用,理解IP数据报的格式,利用C语言设计程序以点分十进制表示输出IP数据报头源/目的地址。
从网络抓取数据包作为源操作数,再生成32位二进制数作为目的操作数,用编程实现将二进制数转化成十进制数,以点分的形式输出在屏幕上。
五、总结体会通过本次课程设计,让我学到了很多。
经过实习,通过实际操作,对计算机网络加深了理解。
才知道计算机网络的可以应用的很灵活,而且加深了对IP数据报格式的了解,点分十进制理解,而且对于C语言也进行了巩固。
在实习中并不是一番风顺的,但是经过努力最终解决了这些困难,让我认识到了坚持的重要性。
总的来说通过实习是我收获不小,也让我认识到了认真学习知识的重要性。
希望学校以后多提供这样的机会。
本次实习,其目的是将以前所学的计算机网络理论知识上升为实践,在编程的基础上进一步了解计算机通信交流以及组网的方法,实践就要求对知识的掌握更加的系统化。
在实习之初,仔细的查找了相关的资料,了解与本实习有关的知识,对IP数据报报头的格式更进一步的复习和掌握,并查找最前沿的资料充实自己,力求将自己的实习做得的更加全面,在实习的准备过程中了解到,在实际的网络管理中大多使用的sniffer 软件对流经网络的数据进行抓取和处理以及分析的过程也可以通过软件的设置将所需数据显示在终端上,本实验所要求处理的任务是将IP数据报报头中的源和目的IP地址以点分十进制的形式输出,程序的实现比较简单,结合以前C语言的基础和编程方法使用随机数生成指令,以及调用C语言库函数实现将二进制的源和目的IP地址转化为点分十进制。
在实验过程中曾试图使用套接字编程实现数据包的抓取,然后使用解析程序分析数据报的报头,但是在具体的实现过程中由于现在使用的VC++平台不包含mstcpip.h库文件,所以程序没有得到验证,但也在思考和设计的过程中学到了很多知识。
六、主要参考文献[1] 谢希仁《计算机网络》(第5版)电子工业出版社 2008[2] 殷肖川《网络编程与开发技术》西安交通大学出版社 2003七、附录附录1 程序流程图图7-1 程序流程图附录2 程序源代码及解释#include "winsock2.h"#include "ws2tcpip.h"#include "iostream.h"#include "stdio.h"#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER //定义IP头{union{BYTE Version; //版本(前4位)BYTE HdrLen; //IHL(后4位),报头标长};BYTE ServiceType; //服务类型WORD TotalLen; //总长WORD ID; //标识union{WORD Flags; //标志(前3位)WORD FragOff; //分段偏移(后13位)};BYTE TimeToLive; //生命期BYTE Protocol; //协议WORD HdrChksum; //头校验和DWORD SrcAddr; //源地址DWORD DstAddr; //目的地址BYTE Options; //选项}IP_HEADER;//逐位解析IP头中的信息void getVersion(BYTE b, BYTE & version){version=b>>4; //右移4位,获取版本字段}void getIHL(BYTE b,BYTE & result){result=(b&0x0f)*4; //获取头部长度字段}char * parseServiceType_getProcedence(BYTE b) {switch(b>>5) //获取服务类型字段中优先级子域{case 7:return "Network Control"; break;case 6:return "Internet work Control"; break;case 5:return "CRITIC/ECP"; break;case 4:return "Flash Override"; break;case 3:return "Flsah";break;case 2:return "Immediate";break;case 1:return "Priority";break;case 0:return "Routine";break;default:return "Unknow";break;}}char * parseServiceType_getTOS(BYTE b){b=(b>>1)&0x0f; //获取服务类型字段中的TOS子域switch(b){case 0:return "Normal service";break;case 1:return "Minimize monetary cost";break;case 2:return "Maximize reliability";break;case 4:return "Maximize throughput";break;case 8:return "Minimize delay";break;case 15:return "Maximize security";break;default:return "Unknow";}}void getFlags(WORD w,BYTE & DF,BYTE & MF) //解析标志字段{DF=(w>>14)&0x01;MF=(w>>13)&0x01;}void getFragOff(WORD w,WORD & fragOff) //获取分段偏移字段{fragOff=w&0x1fff;}char * getProtocol(BYTE Protocol) //获取协议字段共8位{switch(Protocol) //以下为协议号说明:{case 1:return "ICMP";case 2:return "IGMP";case 4:return "IP in IP";case 6:return "TCP";case 8:return "EGP";case 17:return "UDP";case 41:return "IPv6";case 46:return "RSVP";case 89:return "OSPF";default:return "UNKNOW";}}void ipparse(FILE* file,char* buffer){IP_HEADER ip=*(IP_HEADER*)buffer; //通过指针把缓冲区的内容强制转化为IP_HEADER 数据结构fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf(file,"版本号=%d\r\n",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"报头标长=%d(BYTE)\r\n",headerLen);fprintf(file,"服务类型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"总长度=%d(BYTE)\r\n",ip.TotalLen);fprintf(file,"标识=%d\r\n",ip.ID);BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"标志DF=%d,MF=%d\r\n",DF,MF);WORD fragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"分段偏移值=%d\r\n",fragOff);fprintf(file,"生存期=%d (hopes)\r\n",ip.TimeToLive);fprintf(file,"协议=%s\r\n",getProtocol(ip.Protocol));fprintf(file,"头校验和=0x%0x\r\n",ip.HdrChksum);fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,"---------------------------------------------\r\n" );}int main(int argc,char* argv[]){if(argc !=2){printf("usage eror!\n");return -1;}FILE * file;if((file=fopen(argv[1],"wb+"))==NULL){printf("fail to open file %s",argv[1]);return -1;}WSADATA wsData;if(WSAStartup(MAKEWORD(2,2),&wsData)!=0)printf("WSAStartup failed!\n");return -1;}//建立套接字SOCKET sock;if((sock=socket(AF_INET,SOCK_RAW,IPPROTO _IP))==INV ALID_SOCKET){printf("create socket failed!\n");return -1;}BOOL flag=TRUE;//设置IP头操作选项,用户可对IP头处理if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(c har*)&flag,sizeof(flag))==SOCKET_ERROR){printf("setsockopt failed!\n");return -1;}char hostName[128];if(gethostname(hostName,100)==SOCKET_ERR{printf("gethostname failed!\n");return -1;}//获取本地地址hostent * pHostIP;if((pHostIP=gethostbyname(hostName))==NULL) {printf("gethostname failed!\n");return -1;}//填充SOCKADDR_IN结构sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_l ist[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr _in))==SOCKET_ERROR){printf("bind failed!\n");return -1;}//把socket绑定到本地网卡DWORD dwValue=1;//设置SOCK_RAW为SIO_RCV ALL,能接收所有IP包#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1) DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(WSAIoctl(sock,IO_RCV ALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBuff erLen),&dwBytesReturned,NULL,NULL)==SOCKE T_ERROR){printf("ioctlsocket failed!\n");return -1;}//设置接受数据包缓冲区长度#define BUFFER_SIZE 65535char buffer[BUFFER_SIZE];//监听网卡printf("开始解析经过本机的IP数据包:\n");while(true){int size=recv(sock,buffer,BUFFER_SIZE,0);if (size>0){ipparse(stdout,buffer);ipparse(file,buffer);}}fclose(file);return 0;}课程设计成绩评定表。