Ethernet帧结构解析..

合集下载

以太网帧格式

以太网帧格式

以太网帧格式详解:Etherne II报头8 目标地址6 源地址6 以太类型2 有效负载46-1500 帧检验序列4 报头:8个字节,前7个0,1交替的字节(10101010)用来同步接收站,一个1010101011字节指出帧的开始位置。

报头提供接收器同步和帧定界服务。

目标地址:6个字节,单播、多播或者广播。

单播地址也叫个人、物理、硬件或MAC地址。

广播地址全为1,0xFF FF FF FF。

源地址:6个字节。

指出发送节点的单点广播地址。

以太网类型:2个字节,用来指出以太网帧内所含的上层协议。

即帧格式的协议标识符。

对于IP报文来说,该字段值是0x0800。

对于ARP信息来说,以太类型字段的值是0x0806。

有效负载:由一个上层协议的协议数据单元PDU构成。

可以发送的最大有效负载是1500字节。

由于以太网的冲突检测特性,有效负载至少是46个字节。

如果上层协议数据单元长度少于46个字节,必须增补到46个字节。

帧检验序列:4个字节。

验证比特完整性。

IEEE 802.3根据IEEE802.2 和802.3标准创建的,由一个IEEE802.3报头和报尾以及一个802.2LLC报头组成。

报头7 起始限定符1 目标地址6(2)源地址6(2)长度2 DSAP1 SSAP1 控件2 有效负载3 帧检验序列4-----------802.3报头--------------§---802.2报头----§ §-802.3报尾-§IEEE802.3报头和报尾报头:7个字节,同步接收站。

位序列10101010起始限定符:1个字节,帧开始位置的位序列10101011。

报头+起始限定符=Ethernet II的报头目标地址:同Ethernet II。

也可以为2个字节,很少用。

源地址:同Ethernet II。

也可以为2个字节,很少用。

长度:2个字节。

帧检验序列:4个字节。

IEEE802.2 LLC报头DSAP:1个字节,指出帧的目标节点的上层协议。

以太网(Ethernet)的帧结构

以太网(Ethernet)的帧结构
以太网( 以太网(Ethernet)的帧结构 )
以太网(Ethernet)的帧结构
1.Ethernet V2.0帧结构 2. IEEE802.3帧结构 3. Ethernet V2.0帧结构组成详解
Ethernet V2.0帧结构
帧前 帧校 前导 目的 源地 数据 定界 验字 类型 码 地址 址 字段 符 段 46~1 7B 1B 6B 6B 2B 4B 500B 注:Ethernet帧的最小长度为64B,最大长 度为1518B。(前导码与帧前定界符不计入 帧头长度中)
前导码与帧前定界符字段
前导码的组成: 前导码的组成:56位(7B)10101010…10 1010比特序列。 作用: 作用:提醒接收系统有帧的到来,以及使到来的 帧与计时器进行同步。 帧前定界符的组成: 帧前定界符的组成:8位(1B)10101011比特 序列。 作用: 作用:表示下面的字段是目的地址。
数据字段
数据字段的组成: 数据字段的组成:长度在46~1500B之间的比 特序列。 特点: 特点:如果数据的长度少于46B,需要加填充 字节,补充到46B。填充字节是任意的,不计 入长度字段中。
帧校验字段
帧校验字段的组成: 32位 4B)比特序列。 帧校验字段的组成: 32位(4B)比特序列。 特点: 特点:采用CRC校验。校验的范围包括目的地 址字段,源地址字段,类型字段,数据字段。 在接收端进行校验,如果发生错误,帧将被丢 弃。 32位CRC校验的生成多项式为: G(x) =x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4 +x2+x1+1
பைடு நூலகம்

列出ethernet v2标准的数据帧的5个字段

列出ethernet v2标准的数据帧的5个字段

列出ethernet v2标准的数据帧的5个字段Ethernet V2标准是以太网传输技术的第二个版本,它在网络通信中广泛应用。

Ethernet V2数据帧是实现数据传输的基本单位,具有特定的结构。

本文将介绍Ethernet V2数据帧的5个字段,并阐述它们的作用和意义。

1.目的地址(Destination MAC Address):目的地址字段用于标识数据帧的接收方。

它位于数据帧的开头,长度为6字节。

发送方通过目的地址字段将数据帧发送到接收方。

接收方在接收到数据帧后,根据目的地址字段判断是否需要处理这个数据帧。

如果目的地址与接收方的MAC地址匹配,则接收方会处理这个数据帧;如果不匹配,则数据帧会被丢弃。

2.源地址(Source MAC Address):源地址字段用于标识数据帧的发送方。

它位于数据帧的目的地址之后,长度也为6字节。

发送方通过源地址字段将自己的MAC地址附加到数据帧中,以便接收方能够识别发送方。

同时,源地址字段有助于实现数据帧的追踪和路由。

3.类型(Type):类型字段用于指示数据帧中所携带的数据类型。

它位于源地址字段之后,长度为2字节。

类型字段的值表示数据帧中数据部分的字节顺序,常用的值为0x0806(IPV4)和0x0815(ARP)。

接收方根据类型字段值判断数据帧中携带的数据是否为己知类型,从而决定如何处理数据帧。

4.数据(Data):数据字段是数据帧的核心部分,用于承载实际传输的数据。

数据字段的长度可变,根据数据类型和实际需求而定。

在数据传输过程中,发送方将数据加载到数据字段中,接收方收到数据帧后,根据数据字段中的数据进行处理。

数据字段长度的不固定性使得Ethernet V2标准具有较高的灵活性。

5.校验和(FCS):校验和字段用于检测数据帧在传输过程中的错误。

它位于数据字段之后,长度为4字节。

发送方在发送数据帧前,根据数据帧的各个字段(不包括校验和字段)计算出一个校验和值,并将其附加到数据帧的末尾。

Ethernet帧结构解析程序C++

Ethernet帧结构解析程序C++
//计算封帧个数 int truelen = data.length(); //数据的真实长度 int length = data.length(); int frameTotal = 0; //总的帧的个数 if (length>MAXLENGTH) {
frameTotal = length / MAXLENGTH;
streampos nCrc = outfile.tellp(); //获得帧校验字段的位 置
outfile.put(char(0x00)); //数据后补1字节的0,用于CRC计 算
int total = nCrc - nCrcs; //获得需要进行CRC计算的数据长 度
outfile.seekg(nCrcs, ios::beg); //将文件指针指向目的地 址
cout << "数据字段:" << divideStr << endl; leftStr = leftStr.substr(MAXLENGTH, length); truelen = leftStr.length(); } else { outfile.put(char(truelen / 256)); //写入2字节的长度 字段 outfile.put(char(truelen % 256)); outfile << leftStr << endl; //写入数据字段 cout << "长度字段:" << hex << truelen << dec << " (" << truelen << ")" << endl; cout << "数据字段:" << leftStr << endl; }

以太帧及IP相关报文分析

以太帧及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报文的源地址和目的地址。

以太数据帧结构

以太数据帧结构
G(2)二进制值
二进制 模二除法
二进制 余数
余数不够 高位 0 凑
Data
CRC
对方使用相同G(x) 一定能够整除
三、随堂练习
一、判断题
1、以太数据帧中,类型字段代表该数据帧是802.3帧还是Ethernet II帧 ( )
2、每个以太数据帧能够封装的最大网络层报文大小为1500字节
()
二、选择题
二、以太数据帧字段
前导码:用于接收方与发送方的同步,7个字节,每个字节的值固定为0xAA。 帧起始定界符:用于标识一个以太网帧的开始,值固定为0xAB。 目的地址:存放48bit的目标MAC地址,用于局域网中交换机寻址转发。 源地址:存放48bit的源MAC地址,用于局域网中交换机学习和目标主机回复。 类型 :用于指定报文头后所接的数据类型。包括:IPv4(0x0800), IPv6(0x86DD), ARP(0x0806),802.1q数据帧(0x8100) 。 数据:用于存放网络层封装的报文内容(比如:IPv4数据包、IPv6数据包、ARP报文)。 FCS(Frame Check Sequence):通过CRC(Cyclic Redundancy Check)算法计算出 来的序列号,用来确定接收到的帧比特是否正确。
1
0
1
1
1
1x25-1 +0x24-1+1x23-1+1x22-1+1x21-1
CRC校验码位数 = 二进制值位数 - 1 二进制值( 10111 )与数据流做模二除法,余数即为CRC校验码
二、模二除法
使用G(x)的二进制值10111对目标数据流1010110做模二除法,求余数值
1001001
10111 1 0 1 0 1 1 0 0 0 0 0

ethernet的拓扑结构

ethernet的拓扑结构

ethernet的拓扑结构
以太网的拓扑结构是指网络中设备之间物理连接的布局方式。

常见的以太网拓扑结构包括总线型、星型、环型和树型四种。

首先是总线型拓扑结构,它是最早的以太网拓扑结构之一。


总线型拓扑结构中,所有设备都连接到同一条主干电缆上。

设备通
过特定的协议来竞争总线上的访问权。

总线型拓扑结构简单、成本低,但是一旦主干电缆出现故障,整个网络将会受到影响。

其次是星型拓扑结构,这是目前应用最为广泛的以太网拓扑结构。

在星型拓扑结构中,所有设备都连接到一个集线器或交换机上。

这种拓扑结构易于安装和维护,同时也减少了单点故障对整个网络
的影响。

然而,星型拓扑结构的缺点是集线器或交换机成为了单点
故障的可能性。

第三种是环型拓扑结构,设备通过一条环形的电缆连接在一起。

在环型拓扑结构中,数据以一个固定的方向在环上传输,因此具有
较高的稳定性。

然而,一旦环中的某个设备出现故障,整个网络将
会受到影响。

最后是树型拓扑结构,它是星型和总线型拓扑结构的结合。

树型拓扑结构通过集线器或交换机将多个星型拓扑结构连接在一起,形成一个树状结构。

这种拓扑结构可以灵活地扩展,并且具有较好的容错性。

综上所述,以太网的拓扑结构有总线型、星型、环型和树型四种,每种拓扑结构都有其特点和适用场景,选择合适的拓扑结构取决于具体的网络需求和条件。

以太网帧结构详解

以太网帧结构详解

以太⽹帧结构详解⽹络通信协议⼀般地,关注于逻辑数据关系的协议通常被称为上层协议,⽽关注于物理数据流的协议通常被称为低层协议。

IEEE802就是⼀套⽤来管理物理数据流在局域⽹中传输的标准,包括在局域⽹中传输物理数据的802.3以太⽹标准。

还有⼀些⽤来管理物理数据流在使⽤串⾏介质的⼴域⽹中传输的标准,如帧中继FR(FrameRelay),⾼级数据链路控制HDLC(High-LevelDataLinkControl),异步传输模式ATM(AsynchronousTransferMode)。

分层模型0OSI国际标准化组织ISO于1984年提出了OSIRM(OpenSystemInterconnectionReferenceModel,开放系统互连参考模型)。

OSI参考模型很快成为了计算机⽹络通信的基础模型。

OSI参考模型具有以下优点:简化了相关的⽹络操作;提供了不同⼚商之间的兼容性;促进了标准化⼯作;结构上进⾏了分层;易于学习和操作。

OSI参考模型各个层次的基本功能如下:物理层:在设备之间传输⽐特流,规定了电平、速度和电缆针脚。

数据链路层:将⽐特组合成字节,再将字节组合成帧,使⽤链路层地址(以太⽹使⽤MAC地址)来访问介质,并进⾏差错检测。

⽹络层:提供逻辑地址,供路由器确定路径。

传输层:提供⾯向连接或⾮⾯向连接的数据传递以及进⾏重传前的差错检测。

会话层:负责建⽴、管理和终⽌表⽰层实体之间的通信会话。

该层的通信由不同设备中的应⽤程序之间的服务请求和响应组成。

表⽰层:提供各种⽤于应⽤层数据的编码和转换功能,确保⼀个系统的应⽤层发送的数据能被另⼀个系统的应⽤层识别。

应⽤层:OSI参考模型中最靠近⽤户的⼀层,为应⽤程序提供⽹络服务。

分层模型-TCP/IPTCP/IP模型同样采⽤了分层结构,层与层相对独⽴但是相互之间也具备⾮常密切的协作关系。

TCP/IP模型将⽹络分为四层。

TCP/IP模型不关注底层物理介质,主要关注终端之间的逻辑数据流转发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一Ethernet帧结构解析一.需求分析实验目的:(1)掌握Ethernet帧各个字段的含义与帧接收过程;(2)掌握Ethernet帧解析软件设计与编程方法;(3)掌握Ethernet帧CRC校验算法原理与软件实现方法。

实验任务:(1)捕捉任何主机发出的Ethernet 802.3格式的帧和DIX Ethernet V2(即Ethernet II)格式的帧并进行分析。

(2)捕捉并分析局域网上的所有ethernet broadcast帧进行分析。

(3)捕捉局域网上的所有ethernet multicast帧进行分析。

实验环境:安装好Windows 2000 Server操作系统+Ethereal的计算机实验时间; 2节课二.概要设计1.原理概述:以太网这个术语通常是指由DEC,Intel和Xerox公司在1982年联合公布的一个标准,它是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法。

几年后,IEEE802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络;此三种帧的通用部分由802.2标准来定义,也就是我们熟悉的802网络共有的逻辑链路控制(LLC)。

以太网帧是OSI参考模型数据链路层的封装,网络层的数据包被加上帧头和帧尾,构成可由数据链路层识别的数据帧。

虽然帧头和帧尾所用的字节数是固定不变的,但根据被封装数据包大小的不同,以太网帧的长度也随之变化,变化的范围是64-1518字节(不包括8字节的前导字)。

帧格式Ethernet II和IEEE802.3的帧格式分别如下。

EthernetrII帧格式:----------------------------------------------------------------------------------------------| 前序| 目的地址| 源地址| 类型| 数据| FCS |----------------------------------------------------------------------------------------------| 8 byte | 6 byte | 6 byte | 2 byte | 46~1500 byte | 4 byte|IEEE802.3一般帧格式-----------------------------------------------------------------------------------------------------------| 前序| 帧起始定界符| 目的地址| 源地址| 长度| 数据| FCS | -----------------------------------------------------------------------------------------------------------| 7 byte | 1 byte | 2/6 byte | 2/6 byte| 2 byte| 46~1500 byte | 4 byte | Ethernet II和IEEE802.3的帧格式比较类似,主要的不同点在于前者定义的2字节的类型,而后者定义的是2字节的长度;所幸的是,后者定义的有效长度值与前者定义的有效类型值无一相同,这样就容易区分两种帧格式2程序流程图:三.详细设计:1.CRC校验部分设计:为了对以太网帧的对错进行检验,需要设计CRC校验部分。

采用以为相与的方式对帧的首部相继作8位CRC校验输入参数:chCurrByte 低8位数据有效,记录了上一次CRC校验的余数chNextByte 低8位数据有效,记录了本次要继续校验的一个字节传出参数:chCurrByte 低8位数据有效,记录了本次CRC校验的余数void checkCRC(int &chCurrByte, int chNextByte){// CRC循环:每次调用进行8次循环,处理一个字节的数据。

for (int nMask = 0x80; nMask > 0; nMask >>= 1){if ((chCurrByte & 0x80) != 0) // 首位为1:移位,并进行异或运算{chCurrByte <<= 1; // 移一位if ( (chNextByte & nMask) != 0) // 补一位{chCurrByte |= 1;}chCurrByte ^= 7; // 首位已经移出,仅对低8位进行异或运算,7的二进制为0000,0111}else // 首位为0,只移位,不进行异或运算{chCurrByte <<= 1; // 移一位if ( (chNextByte & nMask) != 0) // 补一位{chCurrByte |= 1;}}}}2.部分变量的声明:int nSN = 1; // 帧序号int nCheck = 0; // 校验码int nCurrDataOffset = 22; // 帧头偏移量int nCurrDataLength = 0; // 数据字段长度bool bParseCont = true; // 是否继续对输入文件进行解析int nFileEnd = 0; // 输入文件的长度3.计算数据段的长度:nCurrDataLength =bParseCont ? // 是否到达文件末尾(file.tellg() - 8 - 1 - nCurrDataOffset) : // 没到文件末尾:下一帧头位置- 前导码和定界符长度- CRC校验码长度- 数据字段起始位置(file.tellg() - 1 - nCurrDataOffset); // 已到达文件末尾:文件末尾位置- CRC校验码长度- 数据字段起始位置4.主函数的设计:void main(int argc, char* argv[]){// 检测命令行参数的正确性if (argc != 2){cout << "请以帧封装包文件为参数重新执行程序" << endl;exit(0);}// 检测输入文件是否存在,并可以按所需的权限和方式打开ifstream file(argv[1], ios::in|ios::binary|ios::nocreate);if (!file.is_open()){cout << "无法打开帧封装包文件,请检查文件是否存在并且未损坏" << endl;exit(0);}// 变量声明及初始化int nSN = 1; // 帧序号int nCheck = 0; // 校验码int nCurrDataOffset = 22; // 帧头偏移量int nCurrDataLength = 0; // 数据字段长度bool bParseCont = true; // 是否继续对输入文件进行解析int nFileEnd = 0; // 输入文件的长度// 计算输入文件的长度file.seekg(0, ios::end); // 把文件指针移到文件的末尾nFileEnd = file.tellg(); // 取得输入文件的长度file.seekg(0, ios::beg); // 文件指针位置初始化cout.fill('0'); // 显示初始化cout.setf(ios::uppercase); // 以大写字母输出// 定位到输入文件中的第一个有效帧// 从文件头开始,找到第一个连续的“AA-AA-AA-AA-AA-AA-AA-AB”while ( true ){for (int j = 0; j < 7; j++) // 找7个连续的0xaa{if (file.tellg() >= nFileEnd) // 安全性检测{cout<<"没有找到合法的帧"<<endl;file.close();exit(0);}// 看当前字符是不是0xaa,如果不是,则重新寻找7个连续的0xaa if (file.get() != 0xaa){j = -1;}}if (file.tellg() >= nFileEnd) // 安全性检测{cout<<"没有找到合法的帧"<<endl;file.close();exit(0);}if (file.get() == 0xab) // 判断7个连续的0xaa之后是否为0xab {break;}}// 将数据字段偏移量定位在上述二进制串之后14字节处,并准备进入解析阶段nCurrDataOffset = file.tellg() + 14;file.seekg(-8,ios::cur);// 主控循环while ( bParseCont ) // 当仍然可以继续解析输入文件时,继续解析{// 检测剩余文件是否可能包含完整帧头if (file.tellg() + 14 > nFileEnd){cout<<endl<<"没有找到完整帧头,解析终止"<<endl;file.close();exit(0);}int c; // 读入字节int i = 0; // 循环控制变量int EtherType = 0; // 由帧中读出的类型字段bool bAccept = true; // 是否接受该帧// 输出帧的序号cout << endl << "序号:\t\t" << nSN;// 输出前导码,只输出,不校验cout << endl << "前导码:\t";for (i = 0; i < 7; i++) // 输出格式为:AA AA AA AA AA AA AA{cout.width(2);cout << hex << file.get() << dec << " ";}// 输出帧前定界符,只输出,不校验cout << endl << "帧前定界符:\t";cout.width(2); // 输出格式为:ABcout << hex << file.get();// 输出目的地址,并校验cout << endl << "目的地址:\t";for (i = 0; i < 6; i++) // 输出格式为:xx-xx-xx-xx-xx-xx{c = file.get();cout.width(2);cout<< hex << c << dec << (i==5 ? "" : "-");if (i == 0) // 第一个字节,作为“余数”等待下一个bit{nCheck = c;}else // 开始校验{checkCRC(nCheck, c);}}// 输出源地址,并校验cout << endl << "源地址:\t";for (i = 0; i < 6; i++) // 输出格式为:xx-xx-xx-xx-xx-xx{c = file.get();cout.width(2);cout<< hex << c << dec << (i==5 ? "" : "-");checkCRC(nCheck, c); // 继续校验}// 输出类型字段,并校验cout<<endl<<"类型字段:\t";cout.width(2);// 输出类型字段的高8位c = file.get();cout<< hex << c << dec << " ";checkCRC(nCheck, c); // CRC校验EtherType = c;// 输出类型字段的低8位c = file.get();cout.width(2);cout<< hex << c;checkCRC(nCheck,c); // CRC校验EtherType <<= 8; // 转换成主机格式EtherType |= c;// 定位下一个帧,以确定当前帧的结束位置while ( bParseCont ){for (int i = 0; i < 7; i++) //找下一个连续的7个0xaa{if (file.tellg() >= nFileEnd) //到文件末尾,退出循环{bParseCont = false;break;}// 看当前字符是不是0xaa,如果不是,则重新寻找7个连续的0xaa if (file.get() != 0xaa)i = -1;}}// 如果直到文件结束仍没找到上述比特串,将终止主控循环的标记bParseCont置为true bParseCont = bParseCont && (file.tellg() < nFileEnd);// 判断7个连续的0xaa之后是否为0xabif (bParseCont && file.get() == 0xab){break;}}// 计算数据字段的长度nCurrDataLength =bParseCont ? // 是否到达文件末尾(file.tellg() - 8 - 1 - nCurrDataOffset) : // 没到文件末尾:下一帧头位置- 前导码和定界符长度- CRC校验码长度- 数据字段起始位置(file.tellg() - 1 - nCurrDataOffset); // 已到达文件末尾:文件末尾位置- CRC校验码长度- 数据字段起始位置// 以文本格式数据字段,并校验cout << endl << "数据字段:\t";unsigned char* pData = new unsigned char[nCurrDataLength]; // 创建缓冲区file.seekg(bParseCont ? (-8 - 1 -nCurrDataLength) : ( -1 - nCurrDataLength), ios::cur);file.read(pData, nCurrDataLength); // 读入数据字段int nCount = 50; // 每行的基本字符数量for (i = 0; i < nCurrDataLength; i++) // 输出数据字段文本{nCount--;cout << pData[i]; // 字符输出checkCRC(nCheck, (int)pData[i]); // CRC校验if ( nCount < 0) // 换行处理{// 将行尾的单词写完整if ( pData[i] == ' ' ){cout << endl << "\t\t";nCount = 50;}// 处理过长的行尾单词:换行并使用连字符if ( nCount < -10)cout<< "-" << endl << "\t\t";nCount = 50;}}}delete[] pData; //释放缓冲区空间// 输出CRC校验码,如果CRC校验有误,则输出正确的CRC校验码cout << endl <<"CRC校验";c = file.get(); // 读入CRC校验码int nTmpCRC = nCheck;checkCRC(nCheck, c); // 最后一步校验if ((nCheck & 0xff) == 0) // CRC校验无误{cout.width(2);cout<<"(正确):\t"<< hex << c;}else // CRC校验有误{cout.width(2);cout<< "(错误):\t" << hex << c;checkCRC(nTmpCRC, 0); // 计算正确的CRC校验码cout<< "\t应为:" << hex << (nTmpCRC & 0xff);bAccept = false; // 将帧的接收标记置为false}// 如果数据字段长度不足46字节或数据字段长度超过1500字节,则将帧的接收标记置为falseif (nCurrDataLength < 46 || nCurrDataLength > 1500 ){bAccept = false;}// 输出帧的接收状态cout<< endl << "状态:\t\t" << (bAccept ? "Accept" : "Discard") << endl <<endl;nSN++; // 帧序号加1nCurrDataOffset = file.tellg() + 22; // 将数据字段偏移量更新为下一帧的帧头结束位置}// 关闭输入文件file.close();}四.运行结果:五.简明用户手册:用户需将源程序在VC++6.0下运行成功后,将实验1.EXE放在DOS下运行,运行的同时需要输入位置参数,本例用的位置参数为input,回车即可。

相关文档
最新文档