im钱包下载地址
数字资产服务平台

im钱包下载地址是全球著名的数字资产交易平台之一,主要面向全球用户提供比特币、莱特币、以太币等数字资产的币币和衍生品交易服务。

tokenpocket钱包下载官方app|ethernet帧结构解析程序设计

时间:2024-03-14 20:32:47

Ethernet帧结构解析程序-CSDN博客

>

Ethernet帧结构解析程序-CSDN博客

Ethernet帧结构解析程序

最新推荐文章于 2024-03-13 15:48:54 发布

Talliyr

最新推荐文章于 2024-03-13 15:48:54 发布

阅读量345

收藏

11

点赞数

6

文章标签:

网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Talliyr/article/details/135615444

版权

一、Ethernet V2.0帧的结构

如图所示,Ethernet V2.0帧中有以下几部分组成:

(1)前导码和帧前定界符字段:

        前导码由56位(7B)的10101010…1010比特序列组成,帧前定界符由一个8位的字节组成,比特序列位10101011。

(2)目的地址和源地址:

        目的地址和源地址分别表示帧的接受节点与发送节点的硬件地址。硬件地址一般称作MAC地址、物理地址或Ethernet地址。地址长度为6B.通常用十六进制数书写。

(3)类型字段:

        表示的是网络层使用的协议类型,例如,当该字段值等于0x0800时,表示网络层是用IP协议。

(4)数据字段:

        IEEE 802.3协议规定数据的长度在46到1500B之间。如果数据字段长度少于46B,需要加填充字节。

(5)帧校验字段:

        帧校验字段FCS采用32位CRC校验。校验的范围包括目的地址字段、源地址字段、类型字段、数据字段。在接收端进行校验,如果发现错误,帧将被丢弃。

二、程序设计

1.安全及有效性检测:

        该程序要求命令行输入,有且仅有一个输入参数,输入参数为Ethernet帧封包文件名。因此,首先要判断输入的命令行参数是否正确。对于由命令行参数传入的文件名称,其对应的文件必须存在并可以通过二进制、只读的方式打开,如果文件不存在或不能按照所需要的方式打开,则视为输入文件有误。

2.程序初始化:

        定位输入文件中第一个有效的Ethernet帧,即找到输入文件中第一个连续的“AA AA AA AA AA AA AA AB”字符串。

3.主控循环:

        是解析过程的主体,解析帧结构的每个字段,并判断帧的正确性,每次循环可分为:安全性检测、帧头信息的解析、数据字段确定和输出、CRC校验。其中CRC校验设计成独立的函数,在每次读入字段后调用该函数。

三、代码实现

#include

#include

using namespace std;

void checkCRC(int& chCurrByte, int chNextByte) //crc校验函数

{

for (int nMask = 0x80; nMask > 0; nMask >>= 1)

{

if ((chCurrByte & 0x80) != 0)

{

chCurrByte <<= 1;

if ((chNextByte & nMask) != 0)

{

chCurrByte |= 1;

}

chCurrByte ^= 7;

}

else

{

chCurrByte <<= 1;

if ((chNextByte & nMask) != 0)

{

chCurrByte |= 1;

}

}

}

}

int main(int argc, char* argv[])

{

//命令行传入参数的安全性检测

if (argc != 2)

{

cout << "请以帧封包文件名为参数重新执行程序" << endl;

exit(0);

}

FILE *fp = fopen("C://Users//g3044//source//repos//Ethernet//x64//Debug//input", "rb");//将文件指针指向输入文件

if (fp==NULL)

{

cout << "无法打开帧封包文件,请检查文件是否存在并且未损坏" << endl;

exit(0);

}

int nFileEnd;//文件长度

int Eno = 1;//帧序号

int Checkno = 0;//校验码

int buffer = 0;//读入缓存

//计算文件长度

fseek(fp,0,SEEK_END);//将指针指向文件末尾

nFileEnd = ftell(fp);//取得输入文件的长度

fseek(fp,0,SEEK_SET);//将指针指向文件开头

//定位帧头

while (true)

{

for (int j = 0; j < 7; j++)

{

if (ftell(fp) >= nFileEnd)//文件的安全性检测

{

cout << "没有找到合法的帧" << endl;

fclose(fp);

exit(0);

}

fread(&buffer, 1, 1, fp);

if (buffer != 0xaa)

{

j = -1;

}

}

if (ftell(fp) >= nFileEnd)

{

cout << "没有找到合法的帧" << endl;

fclose(fp);

exit(0);

}

fread(&buffer, 1, 1, fp);

if (buffer == 0xab)

{

break;

}

}

int Datahead = 0;//帧的数据字段的开头位置

Datahead = ftell(fp) + 14;

fseek(fp, -8, SEEK_CUR);//从当前位置向前移动8字节回到前导码之前

bool flag = true;//循环标志

//开始读帧

while (flag)//主控,决定是否继续读帧

{

if (ftell(fp) + 22 > nFileEnd)

{

cout << "没有找到完整帧头,解析终止" << endl;

fclose(fp);

exit(0);

}

//输出序号

cout << endl << "序号: \t\t\t";

cout << Eno;

//输出前导码

cout << endl << "前导码: \t\t";

for (int i = 0; i < 7; i++)

{

fread(&buffer, 1, 1, fp);

cout << setiosflags(ios::uppercase) << hex << buffer << dec;//强制输出大写字母

}

//输出帧前定界符

cout << endl << "帧前定界符: \t\t";

fread(&buffer, 1, 1, fp);

cout << setiosflags(ios::uppercase) << hex << buffer << dec;

//输出目的地址

cout << endl << "目的地址: \t\t";

for (int i = 0; i < 6; i++)

{

fread(&buffer, 1, 1, fp);

cout << setiosflags(ios::uppercase) << hex << setfill('0') << setw(2) << buffer << dec << (i == 5 ? "" : "-");//输出宽度为2,若空则填充0

//将待校验字节传入函数

if (i == 0)

{

Checkno = buffer;

}

else

{

checkCRC(Checkno, buffer);

}

}

//输出源地址

cout << endl << "源地址: \t\t";

for (int i = 0; i < 6; i++)

{

fread(&buffer, 1, 1, fp);

cout << setiosflags(ios::uppercase) << hex << setfill('0') << setw(2) << buffer << dec << (i == 5 ? "" : "-");

checkCRC(Checkno, buffer);

}

//输出类型字段

int EtherType;//类型字段

//输出类型字段的高8位

cout << endl << "类型字段: \t\t";

fread(&buffer, 1, 1, fp);

cout << hex << setfill('0') << setw(2) << buffer;

checkCRC(Checkno, buffer);//传入校验函数

EtherType = buffer;

//输出类型字段的低8位

fread(&buffer, 1, 1, fp);

cout << hex << setfill('0') << setw(2) << buffer;

checkCRC(Checkno, buffer);

EtherType <<= 8;

EtherType |= buffer;

//定位下一个帧

while (flag)

{

for (int i = 0; i < 7; i++)

{

if (ftell(fp) >= nFileEnd)//若到达文件末尾,退出

{

flag = false;

break;

}

fread(&buffer, 1, 1, fp);

if (buffer != 0xaa)

{

i = -1;

}

}

fread(&buffer, 1, 1, fp);

if (buffer == 0xab)

{

break;

}

}

int DataLen = 0;//数据字段的长度

if (flag == true)//如果没到达文件尾部

{

DataLen = ftell(fp) - 9 - Datahead;

}

else if (flag == false)//到达文件尾部

{

DataLen = ftell(fp) - 1 - Datahead;

}

//输出数据字段

cout << endl << "数据字段: \t\t";

unsigned char* pData = new unsigned char [DataLen];//定义数据字段缓冲区

//将指针前移至数据字段的开头

if (flag == true)

{

fseek(fp, -9-DataLen, SEEK_CUR);

}

else if (flag == false)

{

fseek(fp, -1 - DataLen, SEEK_CUR);

}

fread(pData, 1, DataLen, fp);

for (int i = 0; i < DataLen; i++)

{

cout << pData[i];

checkCRC(Checkno, pData[i]);//传入CRC校验函数

}

delete[] pData;//释放缓冲区

pData = NULL;

//输出CRC校验码

cout << endl << "CRC校验码: \t\t";

fread(&buffer, 1, 1, fp);

int tempcrc = Checkno;

checkCRC(Checkno, buffer);

if ((Checkno & 0xff) == 0)

{

cout << "正确:" << hex << buffer << endl;

}

else

{

cout << "错误:" << hex << buffer << endl;

}

Eno++;

Datahead = ftell(fp) + 22;//更新到下一帧数据字段开头位置

}

fclose(fp);

return 0;

}

参考资料:《计算机网络高级软件编程技术(第2版)》 吴宜功等

优惠劵

Talliyr

关注

关注

6

点赞

11

收藏

觉得还不错?

一键收藏

知道了

0

评论

Ethernet帧结构解析程序

对于由命令行参数传入的文件名称,其对应的文件必须存在并可以通过二进制、只读的方式打开,如果文件不存在或不能按照所需要的方式打开,则视为输入文件有误。是解析过程的主体,解析帧结构的每个字段,并判断帧的正确性,每次循环可分为:安全性检测、帧头信息的解析、数据字段确定和输出、CRC校验。校验的范围包括目的地址字段、源地址字段、类型字段、数据字段。定位输入文件中第一个有效的Ethernet帧,即找到输入文件中第一个连续的“AA AA AA AA AA AA AA AB”字符串。

复制链接

扫一扫

Ethernet 帧结构解析程序

11-09

Ethernet 帧结构解析程序,用C++的

C++实现Frame帧结构构建解析程序

10-31

本次实验的目的首先是根据数据链路层的相关知识和数据链路层通信的基本原理,解析已经封装好的Ethernet帧,从而了解Ethernet帧结构的各个字段的含义以及帧的接收过程,更加深刻的了解数据链路层协议;其次就是熟悉C++开发语言,掌握基本的编程技术。

参与评论

您还未登录,请先

登录

后发表或查看评论

以太网帧结构详解

热门推荐

曌赟的博客

07-15

3万+

以太网帧结构详解前言分层模型- OSI分层模型– TCP/IP数据封装终端之间的通信帧格式Ethernet_II 帧格式IEEE802.3 帧格式数据帧传输以太网的MAC地址数据帧的发送和接收单播广播组播发送与接收

前言

20世纪60年代以来,计算机网络得到了飞速发展。各大厂商和标准组织为了在数据通信网络领域占据主导地位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA协议,Novell公...

tellg计算长度_Ethernet帧结构解析..

weixin_42401159的博客

12-24

134

也就是我们熟悉的802网络共有的逻辑链路控制(LLC)。以太网帧是OSI参考模型数据链路层的封装,网络层的数据包被加上帧头和帧尾,构成可由数据链路层识别的数据帧。虽然帧头和帧尾所用的字节数是固定不变的,但根据被封装数据包大小的不同,以太网帧的长度也随之变化,变化的范围是64-1518字节(不包括8字节的前导字)。帧格式EthernetII和IEEE802.3的帧格式分别如下。EthernetrI...

C++ Exercises(十六)---Ethernet帧包结构解析

yunqishequ1的博客

01-09

640

复制代码

/////////////////////////////

///帧信息类 

/////////////////////////////

class CFrame

{

public:

    CFrame(void);

    ~CFrame(void);

    void setSerialNumber(int nSN);

 

第2章 Ethernet帧结构解析程序

05-10

第2章 Ethernet帧结构解析程序源代码

车载诊断协议DoIP系列 —— AL IPv6地址分配&通用DoIP报头结构

Soly_kun的博客

03-10

210

### 本文大体如下:

### 1、系列文章目的

### 2、AL IPv6地址分配

### 3、通用DoIP报头结构

trunk

2301_79947226的博客

03-10

447

当两台交换机之间需要互相传送多个 VLAN 的数据时,就需要使用 trunk 端口。Trunk 端口会将属于不同 VLAN 的数据进行打标记(通常是 IEEE 802.1Q 协议中定义的 VLAN 标识符),从而使得在传输过程中能够正确区分和处理不同 VLAN 的数据。在华为企业级网络模拟平台(eNSP)中,“trunk” 是指用于在交换机之间传送多个 VLAN 数据的端口。在 eNSP 中,您可以通过配置交换机的接口将其设置为 trunk 端口,从而实现跨交换机的 VLAN 数据传输和通信。

深入理解与应用Keepalive机制

hy199707的博客

03-08

1266

基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的Keepalive机制是为了解决网络中静态默认网关单点故障的问题。在传统的网络架构中,如果作为默认网关的路由器出现故障,会导致整个子网失去对外通信的能力。而VRRP则通过引入主备模式来提供高可用性。

【MODBUS】Java实现的Modbus协议类库——推荐j2mod库

最新发布

开源物联网项目商业化作者

03-13

531

Jamod是另一个开源的Modbus Java库。这个库的设计是完全面向对象的,基于抽象,应该支持易于理解、可重用性和可扩展性。它支持Modbus RTU和Modbus TCP,并且提供了主站和从站的功能。这是jamod Modbus库的一个分支,取自1.2.1版本,根据Apache 2许可证发布,包含在该项目的SVN存储库中。j2mod项目的目标是基于Java编程语言生成一个功能更全面的Modbus(tm)通信库。这是一个积极开发的项目,接受具有Modbus主站和从站开发经验的专业软件工程师提交的文件。

【网络层】IPv6引进的主要变化(湖科大慕课自学笔记)

2301_77185537的博客

03-08

457

我们知道因特网使用的是TCP/IP四层体系结构,其中网际层的网际协议IP是因特网的核心协议,目前常用的是版本4(IPv4):IPv6引进的主要变化。下一代网际协议IPv6。:IPv6的诞生背景。

难❗️计算机考研408难度又破新高!

qq_45018803的博客

03-10

909

除了狠抓计算,我认为大家还需要一些补充资料。

用Java Socket手撸了一个HTTP服务器

zch981964的博客

03-09

905

这一块需要注意一点,正文可能为空,也可能有数据;有数据时,我们要如何把所有的数据都取出来呢?

深入理解网络通信协议(互联网协议)

m0_73912575的博客

03-12

682

深入理解网络通信协议(互联网协议)

零基础如何学习Web 安全,如何让普通人快速入门网络安全?

小司机的奥拓

03-12

821

网络安全现在是朝阳行业,缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大初级的现在有很多的运维人员转网络安全,初级也会慢慢的卷起来,但是岗位多不用怕,以后各大厂也都会要网络安全人员,后续法律也会改革,网络安全只会越来越好,毕竟是国家牵头的,网络安全问题导致很多大企业都泄露过信息,还有被勒索的,层出不穷。这个行业优势就是工资高,缺点就需要一直学,卷得要死,不是跟别人卷,而是跟自己卷,一会后面细说这个行业目前从事最多几个岗位,分别是安全运维,安全服务,安全研究。

2024年华为HCIA-DATACOM新增题库(H12-811)

lwljh134的博客

03-11

998

TTL 字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的 值减1,然后再将IP包转发出去。试题解析:主机A对应vlan为10,主机B为20,主机C为100,对于SWA,主机A的MAC地址与G0/0/1进行绑定,主机B的MAC地址与G0/0/2进行绑定,主机C的MAC地址绑定G0/0/3口,对于SWB,主机A和B的MAC地址与G0/0/3进行绑定,主机C的MAC地址与G0/0/1进行绑定,因此答案选AB。

DesignCon 2024|锐捷网络参与发表数据中心交换机相关论文,引发关注

luojiezong的博客

03-08

456

此外,论文全面展示了800G LPO系统在单模和多模模块下的实际链路性能,并结合具体应用场景,为LPO系统的实际应用提供了切实可行的建议,旨在推动产业界克服LPO系统产业化所面临的难题。在全球互联网流量激增和数据应用需求多样化的当下,锐捷网络,作为AIGC全栈服务专家,不仅专注于网络技术的革新与进步,更致力于以创新思维解决客户面临的挑战,率先推出了AI-Flexiforce和AI-Fabric解决方案。这种互利共赢的合作模式预示着网络技术的新突破,为整个行业带来创新的无限可能。

ethernet/IP 协议栈

06-06

2. 以太网数据链路层:实现以太网帧格式的解析和生成,以及帧的发送和接收等。 3. IP协议层:实现以太网设备的IP地址分配和路由选择等。 4. TCP/UDP传输层:实现TCP和UDP协议,用于应用程序之间的可靠数据传输。 ...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

Talliyr

CSDN认证博客专家

CSDN认证企业博客

码龄2年

暂无认证

1

原创

172万+

周排名

22万+

总排名

345

访问

等级

16

积分

5

粉丝

6

获赞

0

评论

11

收藏

私信

关注

热门文章

Ethernet帧结构解析程序

345

最新评论

Ethernet帧结构解析程序

CSDN-Ada助手:

恭喜你开始博客创作!标题中的“Ethernet帧结构解析程序”听起来非常有意思。希望你能够在博客文章中详细解释Ethernet帧结构的重要性和用途,这将使读者更好地理解你的主题。此外,你可以考虑在下一篇文章中,探索一些实际的案例或示例,以帮助读者更好地理解如何应用这个解析程序。继续努力,期待你的下一篇博客!

推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

2024年1篇

目录

目录

最新文章

2024年1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

C++ Exercises(十六)---Ethernet帧包结构解析-CSDN博客

>

C++ Exercises(十六)---Ethernet帧包结构解析-CSDN博客

C++ Exercises(十六)---Ethernet帧包结构解析

最新推荐文章于 2019-03-05 18:32:00 发布

iteye_5736

最新推荐文章于 2019-03-05 18:32:00 发布

阅读量270

收藏

3

点赞数

2

文章标签:

c/c++

图1是一个假想的帧包结构,

图2是解包后的结果。

///

//

///

帧信息类

///

//

class

CFrame {

public

: CFrame(

void

);

~

CFrame(

void

);

void

setSerialNumber(

int

nSN);

void

setPreCode(

const

string

&

strPreCode);

void

setPreBoundCode(

const

string

&

strBoundCode);

void

setEtherType(

const

string

&

strEtherType);

void

setData(

char

*

strData,

int

len);

void

setCRC(

const

string

&

strCRC);

void

setFrameState(

bool

isValid);

void

setDstAddress(

const

string

&

desAddress);

void

setSrcAddress(

const

string

&

srcAddress);

private

:

int

nFrameSN;

//

帧序号

string

strPreCode;

//

前导码

string

strPreBoundCode;

//

帧前定界符

string

strDstAddress;

//

目的地址

string

strSrcAddress;

//

源地址

string

strEtherType;

//

帧类型

string

strData;

//

数据域

string

strCRC;

//

CRC校验码

bool

bIsValid;

//

是否正确的帧

friendostream

&

operator

<<

(ostream

&

out

,

const

CFrame

&

frame); }; CFrame::CFrame(

void

) {

this

->

nFrameSN

=

-

1

;

this

->

bIsValid

=

false

;

this

->

strEtherType

=

""

;

this

->

strCRC

=

""

;

this

->

strData

=

""

;

this

->

strDstAddress

=

""

;

this

->

strPreBoundCode

=

""

;

this

->

strPreCode

=

""

;

this

->

strSrcAddress

=

""

; } CFrame::

~

CFrame(

void

) { }

void

CFrame::setSerialNumber(

int

nSN) {

this

->

nFrameSN

=

nSN; }

void

CFrame::setPreCode(

const

string

&

strPreCode) {

this

->

strPreCode

=

strPreCode; }

void

CFrame::setPreBoundCode(

const

string

&

strBoundCode) {

this

->

strPreBoundCode

=

strBoundCode; }

void

CFrame::setEtherType(

const

string

&

strEtherType) {

this

->

strEtherType

=

strEtherType; }

void

CFrame::setData(

char

*

strData,

int

len) {

this

->

strData

=

string

(strData,len); }

void

CFrame::setCRC(

const

string

&

strCRC) {

this

->

strCRC

=

strCRC; }

void

CFrame::setFrameState(

bool

isValid) {

this

->

bIsValid

=

isValid; }

void

CFrame::setDstAddress(

const

string

&

desAddress) {

this

->

strDstAddress

=

desAddress; }

void

CFrame::setSrcAddress(

const

string

&

srcAddress) {

this

->

strSrcAddress

=

srcAddress; }

///

//

///

帧解析器类

///

class

CFrameParser {

public

: CFrameParser(

void

); CFrameParser(

const

char

*

pFilePath); CFrameParser(

const

string

&

strFilePath);

~

CFrameParser(

void

);

bool

DoParser();

//

实际的解析动作

private

:

string

strInputFile;

//

帧数据文件

vector

<

CFrame

>

vecFrames;

//

帧包列表

}; CFrameParser::CFrameParser(

void

) { } CFrameParser::

~

CFrameParser(

void

) { } CFrameParser::CFrameParser(

const

char

*

pFilePath):strInputFile(pFilePath) { } CFrameParser::CFrameParser(

const

string

&

strFilePath):strInputFile(strFilePath) { }

bool

CFrameParser::DoParser() {

//

检测输入文件是否存在,并可以按所需的权限和方式打开

ifstreamfile(

this

->

strInputFile.c_str(),ios::

in

|

ios::binary

|

ios::_Nocreate);

if

(

!

file.is_open()) { cout

<<

"

无法打开帧封装包文件,请检查文件是否存在并且未损坏

"

<<

endl;

return

false

; }

//

变量声明及初始化

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

++

)

//

找个连续的xaa

{

if

(file.tellg()

>=

nFileEnd)

//

安全性检测

{ cout

<<

"

没有找到合法的帧

"

<<

endl; file.close();

return

false

; }

//

看当前字符是不是xaa,如果不是,则重新寻找个连续的xaa

if

(file.

get

()

!=

0xaa

) { j

=

-

1

; } }

if

(file.tellg()

>=

nFileEnd)

//

安全性检测

{ cout

<<

"

没有找到合法的帧

"

<<

endl; file.close();

return

false

; }

if

(file.

get

()

==

0xab

)

//

判断个连续的xaa之后是否为xab

{

break

; } }

//

将数据字段偏移量定位在上述二进制串之后字节处,并准备进入解析阶段

nCurrDataOffset

=

static_cast

<

int

>

(file.tellg())

+

14

; file.seekg(

-

8

,ios::cur);

//

主控循环

while

(bParseCont)

//

当仍然可以继续解析输入文件时,继续解析

{

//

检测剩余文件是否可能包含完整帧头

if

(static_cast

<

int

>

(file.tellg())

+

14

>

nFileEnd)//从目的字段到类型字段总共14字节 { cout

<<

endl

<<

"

没有找到完整帧头,解析终止

"

<<

endl; file.close();

return

false

; } CFrameframe;

int

c;

//

读入字节

int

i

=

0

;

//

循环控制变量

int

EtherType

=

0

;

//

由帧中读出的类型字段

bool

bAccept

=

true

;

//

是否接受该帧

//

输出帧的序号

frame.setSerialNumber(nSN);

//

输出前导码,只输出,不校验

string

tmpPreCode

=

""

;

for

(i

=

0

;i

<

7

;i

++

)

//

输出格式为:AAAAAAAAAAAAAA

{ c

=

file.

get

();

string

hexCode

=

util::ConvertToHex(c); tmpPreCode.append(hexCode);

if

(i

!=

6

) { tmpPreCode.append(

1

,

'

'

); } } frame.setPreCode(tmpPreCode);

//

输出帧前定界符,只输出,不校验

cout

<<

endl

<<

"

帧前定界符:/t

"

; cout.width(

2

);

//

输出格式为:AB

c

=

file.

get

();

string

tmpBoundCode

=

util::ConvertToHex(c); frame.setPreBoundCode(tmpBoundCode);

string

tmpDesAddress;

//

输出目的地址,并校验

for

(i

=

1

;i

<=

6

;i

++

)

//

输出格式为:xx-xx-xx-xx-xx-xx

{ c

=

file.

get

();

string

desAddr

=

util::ConvertToHex(c); tmpDesAddress.append(desAddr);

if

(i

!=

6

) { tmpDesAddress.append(

1

,

'

-

'

); }

if

(i

==

1

)

//

第一个字节,作为“余数”等待下一个bit

{ nCheck

=

c; }

else

//

开始校验

{ util::CRC::checkCRC(nCheck,c); } } frame.setDstAddress(tmpDesAddress);

string

tmpSrcAddress;

//

输出源地址,并校验

for

(i

=

1

;i

<=

6

;i

++

)

//

输出格式为:xx-xx-xx-xx-xx-xx

{ c

=

file.

get

();

string

srcAddr

=

util::ConvertToHex(c); tmpSrcAddress.append(srcAddr);

if

(i

!=

6

) { tmpSrcAddress.append(

1

,

'

-

'

); } util::CRC::checkCRC(nCheck,c);

//

继续校验

} frame.setSrcAddress(tmpSrcAddress);

///

/输出类型字段,并校验

//

输出类型字段的高位

c

=

file.

get

(); util::CRC::checkCRC(nCheck,c);

//

CRC校验

EtherType

=

c;

//

输出类型字段的低位

c

=

file.

get

(); util::CRC::checkCRC(nCheck,c);

//

CRC校验

EtherType

<<=

8

;

//

转换成主机格式

EtherType

|=

c;

string

tmpType

=

util::ConvertToType(EtherType); frame.setEtherType(tmpType);

//

定位下一个帧,以确定当前帧的结束位置

while

(bParseCont) {

for

(

int

i

=

0

;i

<

7

;i

++

)

//

找下一个连续的个xaa

{

if

(file.tellg()

>=

nFileEnd)

//

到文件末尾,退出循环

{ bParseCont

=

false

;

break

; }

//

看当前字符是不是xaa,如果不是,则重新寻找个连续的xaa

if

(file.

get

()

!=

0xaa

) { i

=

-

1

; } }

//

如果直到文件结束仍没找到上述比特串,将终止主控循环的标记bParseCont置为true

bParseCont

=

bParseCont

&&

(file.tellg()

<

nFileEnd);

//

判断个连续的xaa之后是否为xab

if

(bParseCont

&&

file.

get

()

==

0xab

) {

break

; } }

//

计算数据字段的长度

nCurrDataLength

=

bParseCont

?

//

是否到达文件末尾

(static_cast

<

int

>

(file.tellg())

-

8

-

1

-

nCurrDataOffset):

//

没到文件末尾:下一帧头位置-前导码和定界符长度-CRC校验码长度-数据字段起始位置

(static_cast

<

int

>

(file.tellg())

-

1

-

nCurrDataOffset);

//

已到达文件末尾:文件末尾位置-CRC校验码长度-数据字段起始位置

//

以文本格式数据字段,并校验

char

*

pData

=

new

char

[nCurrDataLength];

//

创建缓冲区

file.seekg(bParseCont

?

(

-

8

-

1

-

nCurrDataLength):(

-

1

-

nCurrDataLength),ios::cur); file.read(pData,nCurrDataLength);

//

读入数据字段

frame.setData(pData,nCurrDataLength);

int

nCount

=

50

;

//

每行的基本字符数量

for

(i

=

0

;i

<

nCurrDataLength;i

++

)

//

输出数据字段文本

{ util::CRC::checkCRC(nCheck,(

int

)pData[i]);

//

CRC校验

} delete[]pData;

//

释放缓冲区空间

//

输出CRC校验码,如果CRC校验有误,则输出正确的CRC校验码

cout

<<

endl

<<

"

CRC校验

"

; c

=

file.

get

();

//

读入CRC校验码

int

nTmpCRC

=

nCheck; util::CRC::checkCRC(nCheck,c);

//

最后一步校验

string

strCRC

=

util::ConvertToHex(c); frame.setCRC(strCRC);

if

((nCheck

&

0xff

)

!=

0

)

//

CRC校验无误

{ bAccept

=

false

;

//

将帧的接收标记置为false

}

//

如果数据字段长度不足字节或数据字段长度超过字节,则将帧的接收标记置为false

if

(nCurrDataLength

<

46

||

nCurrDataLength

>

1500

) { bAccept

=

false

; } frame.setFrameState(bAccept); vecFrames.push_back(frame); nSN

++

;

//

帧序号加

nCurrDataOffset

=

static_cast

<

int

>

(file.tellg())

+

22

;

//

将数据字段偏移量更新为下一帧的帧头结束位置

}

//

关闭输入文件

file.close();

return

true

; }

namespace

util {

//

实用工具

class

CRC {

public

:

//

//

//

CRC校验,在上一轮校验的基础上继续作位CRC校验

//

//

输入参数:

//

chCurrByte低位数据有效,记录了上一次CRC校验的余数

//

chNextByte低位数据有效,记录了本次要继续校验的一个字节

//

//

传出参数:

//

chCurrByte低位数据有效,记录了本次CRC校验的余数

//

//

static

void

checkCRC(

int

&

chCurrByte,

int

chNextByte) {

//

CRC循环:每次调用进行次循环,处理一个字节的数据。

for

(

int

nMask

=

0x80

;nMask

>

0

;nMask

>>=

1

) {

if

((chCurrByte

&

0x80

)

!=

0

)

//

首位为1:移位,并进行异或运算{

chCurrByte

<<=

1

;

//

移一位

if

((chNextByte

&

nMask)

!=

0

)

//

补一位

{ chCurrByte

|=

1

; } chCurrByte

^=

7

;

//

首位已经移出,仅对低位进行异或运算,的二进制为,0111

}

else

//

首位为0,只移位,不进行异或运算

{ chCurrByte

<<=

1

;

//

移一位

if

((chNextByte

&

nMask)

!=

0

)

//

补一位

{ chCurrByte

|=

1

; } } } } };

char

mappingTable[]

=

{

'

0

'

,

'

1

'

,

'

2

'

,

'

3

'

,

'

4

'

,

'

5

'

,

'

6

'

,

'

7

'

,

'

8

'

,

'

9

'

,

'

A

'

,

'

B

'

,

'

C

'

,

'

D

'

,

'

E

'

,

'

F

'

};

string

ConvertToHex(

int

ch) {

int

high

=

ch

/

16

;

int

low

=

ch

%

16

;

string

result; result.append(

1

,mappingTable[high]); result.append(

1

,mappingTable[low]);

return

result; }

string

ConvertToType(

int

ch) {

string

result;

int

num,i;

for

(i

=

0

;i

<

4

;

++

i) { num

=

ch

&

0x000F

; ch

>>=

4

; result.append(

1

,mappingTable[num]);

if

(i

==

1

) { result.append(

1

,

'

'

); } }

for

(i

=

0

;i

<=

1

;

++

i) { swap(result[i],result[

4

-

i]); }

return

result; } }

优惠劵

iteye_5736

关注

关注

2

点赞

3

收藏

觉得还不错?

一键收藏

知道了

0

评论

C++ Exercises(十六)---Ethernet帧包结构解析

图1是一个假想的帧包结构,图2是解包后的结果。&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;...

复制链接

扫一扫

Ethernet、Tcp、Udp等协议的数据包格式

梦里花

10-12

6477

 TCP/IP协议是一个比较复杂的协议集,有很多专业书籍介绍。在此,我仅介绍其与编程密切相关的部分:以太网上TCP/IP协议的分层结构及其报文格式。我们知道TCP/IP协议采用分层结构,其分层模型及协议如下表: 应 用 层(Application)HTTP、Telnet、FTP、SMTP、SNMP传 输 层(Transport)TCP、UDP网 间 网层(Internet)IP【ARP、RARP、

C++ 捕获与解析IP数据包 (winpcap)

热门推荐

Fuguir™的博客

12-28

2万+

源代码链接:https://download.csdn.net/download/chd_lcj/10891420

(不知道为什么积分涨到4积分了。。。原先只是单纯的想分享下的,结果最低只能设置1积分)

//网络编程学习经验记录贴

winpcap简介

WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。

WinPcap...

参与评论

您还未登录,请先

登录

后发表或查看评论

EtherNet / IP协议库,支持ROS,C++实现.zip

03-28

EtherNet / IP协议库源代码,此库包含一个支持ROS的库,该库实现了EtherNet / IP(工业协议),需要自己编译

如何使用Windows C++发送以太网(Ethernet)帧

srzhz的专栏

08-16

9101

Objective

To send an arbitrary Ethernet frame using an AF_PACKET socket

Background

Ethernet is a link layer protocol. Most networking programs interact with the network stack at the transport lay

(转)TCP/IP 数据包头格式

weixin_30725315的博客

05-15

824

最近狂补基础,猛看TCP/IP协议。不过,书上的东西太抽象了,没有什么数据实例,看了不 久就忘了。于是,搬来一个sniffer,抓了数据包来看,呵呵,结合书里面得讲解,理解得 比较快。我就来灌点基础知识。 

  开始吧,先介绍IP协议。 

  IP协议(Internet Protocol)是网络层协议,用在因特网上,TCP,UDP,ICMP,IGMP数据都是按照IP数据格式发送得...

Exercises-handson-circuits.zip

04-02

Exercises-handson-circuits.zip 介绍了关于Exercises-handson-circuits.zip的详细说明,提供其它知识的技术资料的下载。

Exercises_CD-BasedTraining_exercises_BasicsI_

09-29

LabVIEW Basics I CD-Based Training

python-exercises:竞争性编程练习

03-14

python练习 该文件夹不是那么重要:它仅包含一组练习,以训练自己编写高效的算法。

tensorflow-exercises:TensorFlow练习-专注于与NumPy的比较

02-06

TensorFlow练习截至2017年,TensorFlow无疑是最受欢迎的深度学习库。 旨在帮助那些想熟悉TensorFlow功能的人。 特别是,我专注于将TensorFlow函数与事实上的标准数值计算库NumPy中的等效函数进行比较。...

javascript-developer-exercises:一些简单JavaScript开发人员采访练习

05-05

javascript-developer-exercises 一些JavaScript开发人员练习将其用作求职面试的前置屏幕 只需分叉此存储库(或下载它),然后查看exercises文件夹中的每个文件。 该怎么办 每个练习都将包含一些代码的外壳,以及在...

帧的封装与解析 (以太网帧结构)

11-05

帧是如何封装和解析的

初学者可以参考一下

以太网帧解析程序

05-11

完整的以太网帧解析程序,使用C++完成,可直接运行,内含程序源码与说明文档。

C++ Ethernet帧封装_解析_多线程模拟发送消息

03-15

摘要:VC/C++源码,系统相关,多线程

C++ Ethernet帧封装_解析_模拟发送,分为单线程模拟发送和多线程模拟发送,压缩包中有供测试用的可执行程序和源代码文件,测试字符串NankaiU.txt是发消息时用的。

运行环境:Windows/Visual C/C++

Ethernet(以太网)帧的解析封装与模拟发送完整源代码及说明文档

10-20

Ethernet V2.0帧的解析、封装和模拟发送。解析和封装时均涉及到CRC校验,故程序中含一个计算CRC校验的函数。本程序为南开大学吴功宜老师的计算机网络课程研究生作业,代码注释清晰、便于阅读,附带可执行程序和一个说明文档,介绍本程序的背景知识,主要流程,核心代码,参考资料等内容。

学习计算机网络极好的资料!

Ethernet帧的解析

12-12

1.按Ethernet V2.0格式封装Ethernet帧,源地址来自本机MAC地址,目的地址为随意编写的有效MAC地址,类型字段为IP协议对应值,数据字段来自文本文件(见附件),帧校验字段采用8位CRC校验。

2.输出每个帧的各字段内容,数据字段采用字符串输出,其他字段为十六进制输出。

3.命令行程序(85分封顶)或图形化程序(100分封顶)。

ETHERNET数据包格式( IP & UDP & ICMP & ARP )

gaofeidongdong的专栏

11-25

3412

一、ETHERNET 数据包的协议类型 TYPE 的值为 0x0800:IP协议,即:ETHERTYPE_IP,

    该值在 /usr/include/net/ethernet.h中有定义。ETHERNET 数据包的格式又细分

    为如下几种情况:

(1) IP 报头中的协议号码为 IPPROTO_TCP,其值为 6 。ETHERNET 数据包的格式如下:

    ||

EtherNet/IP 协议结构

weixin_33858336的博客

03-05

1万+

一、Ethernet/IP 协议

将标准的TCP/IP以太网延伸 到工业实时控制并和通用工业协议(CIP)结合,将很好地帮助用户获得更加开放集成的工业自动化和信息化的整体解决方案。EtherNet/IP 就是为实现这一目的的标准工业以太网技术。Ethernet/IP是一个面向工业自动化应用的工业应用层协议。它建立在标准是由ODVA(OpenDeviceNet VendorsAssoci...

网络包几种格式ethhdr、ether_header、iphdr、tcphdr、udphdr

fangxin205的专栏

01-19

6390

1、iphdriphdr,是一种计算机用语。是Linux下IP数据包的描述结构体。所在头文件为/usr/src/linux/include/linux/ip.h,结构如下:

struct iphdr {

#if defined(__LITTLE_ENDIAN_BITFIELD) //小端模式下

__u8 ihl:4,//首部长度(4位)

version:4;//ip协议版本I

网络高级软件编程(Ethernet帧的封装)

11-26

网络高级软件编程(Ethernet帧的封装) 老师要的 做实验的可以参考一下

linux-programming-interface-exercises

最新发布

09-24

《Linux编程接口练习》是一本关于Linux编程接口的练习题集。该书旨在帮助读者深入了解Linux操作系统的内部机制和API接口,提高他们在Linux环境下编写高效、可靠和安全的程序的能力。 这本书包含了大量的练习题,...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

iteye_5736

CSDN认证博客专家

CSDN认证企业博客

码龄6年

暂无认证

0

原创

-

周排名

169万+

总排名

21万+

访问

等级

495

积分

27

粉丝

13

获赞

2

评论

77

收藏

私信

关注

热门文章

【转】Resources on Real-Time Rendering

7822

[翻译]性别差异:对女性的误解(Differences between the sexes:The mismeasure of woman)

3780

让Double类型完整显示,不用科学计数法显示E

2605

SQL下三种执行CMD命令的方法

2464

WinCE 系统界面修改偏方(一)

1697

最新评论

《那些年啊,那些事——一个程序员的奋斗史》——20

九月茅桃:

凡是市面上带有“Windows CE”字样的书籍,只要能搞到的,都无一例外地全部看了一遍。-->加油努力,梦想总是会实现的。

大变局

向彪-blockchain:

写的不错,just code it !

大家在看

【深度学习实践】HaGRID,YOLOv5,手势识别项目,目标检测实践项目

399

2024年AI辅助研发:科技创新的引擎

1402

java枚举与模拟方法

JavaScript DOM操作(超详细)

#QT(一种朴素的计算器实现方法)

最新文章

关于JavaScript词法

各大瀑布流简析与建议

9个优秀网上免费标签云生成工具

2012年2篇

2011年382篇

2010年212篇

2009年149篇

2008年345篇

2007年436篇

2006年149篇

2005年21篇

目录

目录

最新文章

关于JavaScript词法

各大瀑布流简析与建议

9个优秀网上免费标签云生成工具

2012年2篇

2011年382篇

2010年212篇

2009年149篇

2008年345篇

2007年436篇

2006年149篇

2005年21篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

以太网网络协议Ethernet II 帧分析-CSDN博客

>

以太网网络协议Ethernet II 帧分析-CSDN博客

以太网网络协议Ethernet II 帧分析

最新推荐文章于 2023-03-28 00:21:37 发布

庚庚911

最新推荐文章于 2023-03-28 00:21:37 发布

阅读量2.7w

收藏

158

点赞数

32

分类专栏:

网络

文章标签:

Ethernet II 帧

原文链接:https://note.t4x.org/basic/network-ethernet-protocol-ii/

版权

网络

专栏收录该内容

9 篇文章

3 订阅

订阅专栏

目前主要有两种格式的以太网帧:Ethernet II(DIX 2.0)和IEEE 802.3。

IP、ARP、EAP和QICQ协议使用Ethernet II帧结构,而STP协议则使用IEEE 802.3帧结构。

Ethernet II是由Xerox与DEC、Intel(DIX)在1982年制定的以太网标准帧格式,后来被定义在RFC894中。

IEEE 802.3是IEEE 802委员会在1985年公布的以太网标准封装结构(可以看出二者时间相差不多,竞争激烈),RFC1042规定了该标准(但终究二者都写进了IAB管理的RFC文档中)。

下图分别给出了Ethernet II和IEEE 802.3的帧格式:

⑴ 前导码(Preamble):由0、1间隔代码组成,用来通知目标站作好接收准备。以太网帧则使用8个字节的0、1间隔代码作为起始符。IEEE 802.3帧的前导码占用前7个字节,第8个字节是两个连续的代码1,名称为帧首定界符(SOF),表示一帧实际开始。 ⑵ 目标地址和源地址(Destination Address & Source Address):表示发送和接收帧的工作站的地址,各占据6个字节。其中,目标地址可以是单址,也可以是多点传送或广播地址。 ⑶ 类型(Type)或长度(Length):这两个字节在Ethernet II帧中表示类型(Type),指定接收数据的高层协议类型。而在IEEE 802.3帧中表示长度(Length),说明后面数据段的长度。 ⑷ 数据(Data):在经过物理层和逻辑链路层的处理之后,包含在帧中的数据将被传递给在类型段中指定的高层协议。该数据段的长度最小应当不低于46个字节,最大应不超过1500字节。如果数据段长度过小,那么将会在数据段后自动填充(Trailer)字符。相反,如果数据段长度过大,那么将会把数据段分段后传输。在IEEE 802.3帧中该部分还包含802.2的头部信息。 ⑸ 帧校验序列(FSC):包含长度为4个字节的循环冗余校验值(CRC),由发送设备计算产生,在接收方被重新计算以确定帧在传送过程中是否被损坏。

分析:

1:红色目标地址帧 6 字节; 2:蓝色源地址帧 6 字节; 3:粉色类型 2 字节;

为什么没有“前导码”和“帧校验序列”,参见 https://blog.csdn.net/yetugeng/article/details/100514693 。

1:版本号 4 bit 2:头长度 4 bit 3:服务类型 8 bit 4:总长度 16 bit 5:标识 16 bit 6:标志 4 bit 7:片移量 12 bit 8:生存时间 8 bit 9:上层协议标识 8 bit 10:头部校验和 16 bit 11:源地址 bit 12:目标地址 32 bit 共计:20字节

优惠劵

庚庚911

关注

关注

32

点赞

158

收藏

觉得还不错?

一键收藏

知道了

4

评论

以太网网络协议Ethernet II 帧分析

目前主要有两种格式的以太网帧:Ethernet II(DIX 2.0)和IEEE 802.3。IP、ARP、EAP和QICQ协议使用Ethernet II帧结构,而STP协议则使用IEEE 802.3帧结构。Ethernet II是由Xerox与DEC、Intel(DIX)在1982年制定的以太网标准帧格式,后来被定义在RFC894中。IEEE 802.3是IEEE 802委员会在19...

复制链接

扫一扫

专栏目录

Ethernet II以太网帧详细分析

01-06

通过抓包 的 Ethernet II以太网帧详细分析,非常精细

四种以太网数据包详解

xiao628945的专栏

09-21

5134

1 Ethernet II

1.1 Ethernet II协议简介

  以太网是当今现有局域网采用的最通用的通信协议标准。该标准定义了在局域网中采用的电缆类型和信号处理方法。EthernetII由DEC,Intel和Xerox在1982年公布其标准,Etherent II主要更改了EthernetI的电气特性和物理接口,在帧格式上并无变化。Etherent II采用CSMA/CD的媒体接入

4 条评论

您还未登录,请先

登录

后发表或查看评论

网络协议学习之Ethernet II协议(二层)

weixin_43580872的博客

07-23

1万+

网络协议学习之Ethernet II协议简介一、协议1、协议结构2、二、抓包分析总结

简介

    Ethernet II协议位于五层OSI模型中的第二层,属于链路层的协议。

一、协议

1、协议结构

前导包

目的mac地址(DMac)

源mac地址 (SMac)

类型(Type)

数据(Playload)

校验(CRC)

6 Byte 目的地址

6 Byte 源地址

2 Byte

46 ~ 1500 Byte

2、

二、抓包分析

总结

..

以太网的帧结构

繁星流动天际

03-24

5375

以太网的帧结构分两种:

第一种是Ethernet_II的帧结构,如下图所示:

DMAC:指(destination mac)目的地址,即是接收信息设备的物理地址。

SMAC:指(source MAC)源地址,即是发送信息设备的物理地址。

Type:用来标识data字段中包含的高层协议,即是通告接收信息的设备如何解释该数据字段(数据的封装

都是从应用层到低层逐渐添加的,在数据链路层以上的数据都...

【转】以太网的帧

圣菲尔丁

07-17

577

特别说明:本文内容整理自网络,参考资料见文尾。

一、Ethernet帧格式的发展

二、几种以太网帧简介

2.1 Ethernet I

2.2 Ethernet II(ARPA)

2.3 RAW 802.3

2.4 802.3/802.2 LLC

2.5 802.3/802.2 SNAP

三、以太网帧报头结构及解码

3.1 Ethernet II

3.1.1 Ethern

初识Ethernet II帧格式

m0_51381079的博客

09-27

5274

以太帧有很多种类型。不同类型的帧具有不同的格式和 MTU 值。但在同种物理媒体上都可同时存在。常见的有三种帧格式:Ethernet II 帧是最常见的帧类型,并通常直接被 IP 协议使用;非标准 IEEE 802.3 帧变种;IEEE 802.3帧(后跟逻辑链路控制(LLC) 帧)。本文仅谈对Ethernet II 帧的初步认知。

Ethernet II 类型以太网帧的最小长度为 64 字节(6+6+2+46+4),最大长度为 1518 字节(6+6+2+1500+4)。其...

Ethernet II

qq_45741246的博客

03-28

617

以太网两种标准帧格式之一一种是Ethernet II另一种是 IEEE802.3当Type字段大于等于1536或0x0600时为Ethernet II帧格式当Type字段小于等于1500或0x05DC时为IEEE802.3。

学习笔记之以太网帧结构

weixin_50281314的博客

11-12

1623

以太网两种帧结构简介

关于以太网(Ethernet II)这个网络的个人理解以及应用(2)

热门推荐

@角色扮演#

09-26

1万+

在stm32f107环境下实现如下功能:

- 以太网接口用作串口使用(区别于C/S模型);

- 以太网接口接收全部的网内数据;

- 对网内数据包过滤,仅接收本机相关数据包及广播包; 工具:anysend.exe:Anysend是基于Winpcap驱动开发的,实现以太网接口发送任意自组数据包的工具,各位请自行查找下载;

wireshark.exe:网络抓包工具

如果你是一个嵌入式开发人员,

以太网基础

weixin_34344677的博客

12-29

544

http://zh.wikipedia.org/wiki/IEEE_802

IEEE 802 

指IEEE标准中关于局域网和城域网的一系列标准。更确切的说,IEEE 802标准仅限定在传输可变大小数据包的网络。

其中最广泛使用的有以太网、令牌环、无线局域网等。这一系列标准中的每一个子标准都由委员会中的一个专门工作组负责。

IEEE 802中定义的服务和协议限定在OSI模型[OSI网络参考模...

网络协议TCP/IP实验一 以太网链路层帧格式分析实验

01-09

湘潭大学网络协议TCP/IP实验一, 以太网链路层帧格式分析实验报告,仅供参考

以太网帧协议

10-11

以太网帧协议的解析程序,有利于读者对以太网帧的进行学习和解析

计算机网络实验 分析Ethernet II帧.rar

03-03

计算机网络实验 分析Ethernet II帧.rar

网络协议分析器,以太网帧分析

04-16

网络协议分析器,网络课程设计资料,MAC帧头、IP\TCP\ARP\UDP以及数据部分分析

android 以太网 添加设置Ethernet

11-27

android在设置中添加以太网ethernet方法, 在可以是学习框架的一种好方法。

AO4480&10-VB一款N-Channel沟道SOP8的MOSFET晶体管参数介绍与应用说明

最新发布

03-13

SOP8;N—Channel沟道,40V;10A;RDS(ON)=14mΩ@VGS=10V,VGS=20V;Vth=1.6V;

东北林业大学906农村发展理论与实践2021年考研专业课初试大纲.pdf

03-13

东北林业大学考研初试大纲

东北林业大学《生物质复合材料学》2020考研专业课复试大纲.pdf

03-13

东北林业大学考研复试大纲

使用Kotlin脚本实现gradle-java项目Demo源码

03-13

使用Kotlin脚本实现gradle-java项目,gradle可以使用goovy和kotlin两种语言实现,此Demo主要是用kotlin脚本实现的gradle项目管理,熟悉kotlin脚本的编写,实现可编程的脚本控制,内附一简单测试代码。

计算机实验以太网桢分析,计算机网络实验2 分析 Ethernet帧.

05-30

好的,我会尽力回答你的问题。Ethernet帧是一种在以太网中传输数据的格式,由多个字段组成。下面是常见的字段:

1. 前导码:用于同步各个设备的时钟。

2. 目的MAC地址:指定数据包应该传输到哪个设备。

3. 源MAC地址:指定数据包是由哪个设备发送的。

4. 类型/长度字段:表示数据包的类型或长度。

5. 数据字段:包含实际的数据。

6. 校验和:用于检测数据包是否损坏。

在实验中,可以使用网络分析工具(如Wireshark)来捕获并分析Ethernet帧。通过分析目的MAC地址和源MAC地址,可以确定数据包的来源和目的地。可以通过查看类型/长度字段来确定数据包的类型,例如IP数据包或ARP数据包。此外,还可以检查校验和字段以检测数据包是否损坏。

希望这些信息能够对你有所帮助。如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

庚庚911

博客等级

码龄14年

73

原创

373

点赞

2037

收藏

163

粉丝

关注

私信

热门文章

正则表达式的替换技巧

42312

以太网网络协议Ethernet II 帧分析

27346

DHCP 协议详解

21066

证书关于 pem der cer crt csr pfx 的区别

19097

CentOS6下搭建Extmail邮箱服务

18653

分类专栏

k8s

1篇

iptables

15篇

Spring

2篇

VUE

1篇

wireshark

4篇

嵌入式

1篇

实用工具

1篇

计算机基础

1篇

HTML

IntelliJ IDEA

1篇

maven

1篇

JavaScript

1篇

研发管理

eclipse

2篇

Jenkins

杂文

vmware

2篇

nginx

2篇

网络

9篇

博客

1篇

python

30篇

linux

38篇

shell

8篇

C

17篇

mysql

10篇

java

20篇

硬件

6篇

站点

14篇

监控

11篇

Prometheus

1篇

anisible

3篇

glassfish

3篇

activemq

3篇

协议

20篇

技术分享

7篇

邮件

22篇

windows

12篇

运维

5篇

前端

1篇

工具手册

5篇

reids

2篇

文档资料

1篇

httpd

1篇

最新评论

read()函数的困惑

灰尘驾车:

我其实很好奇为什么6个数字会读到8个字符,我自己试验的时候,第一行有5个字符,我需要把cnt设置为8才能读到第二行的第一个字符,也就是说多读了两个字符才能把这行换掉

DHCP 协议详解

2301_77588844:

表-2:协议结构 (DHCP报文格式) ---这个错了

Windows wmic命令之process进程管理

victor_fj:

博主你好 我这边只要使用where 就报错什么情况?

以太网网络协议Ethernet II 帧分析

Adamant245:

博主您好,我想问一下Data是哪一部分呢?是下面的第二幅图在分析的内容吗?谢谢!

cwRsync-windows下的rsync工具

qq_45816643:

请问安装包可以分享吗

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Docker与k8s的恩怨情仇 系列

iptables详解(14):iptables小结之常用套路

iptables详解(13):iptables动作总结之二

2021年18篇

2020年32篇

2019年124篇

2018年87篇

目录

目录

分类专栏

k8s

1篇

iptables

15篇

Spring

2篇

VUE

1篇

wireshark

4篇

嵌入式

1篇

实用工具

1篇

计算机基础

1篇

HTML

IntelliJ IDEA

1篇

maven

1篇

JavaScript

1篇

研发管理

eclipse

2篇

Jenkins

杂文

vmware

2篇

nginx

2篇

网络

9篇

博客

1篇

python

30篇

linux

38篇

shell

8篇

C

17篇

mysql

10篇

java

20篇

硬件

6篇

站点

14篇

监控

11篇

Prometheus

1篇

anisible

3篇

glassfish

3篇

activemq

3篇

协议

20篇

技术分享

7篇

邮件

22篇

windows

12篇

运维

5篇

前端

1篇

工具手册

5篇

reids

2篇

文档资料

1篇

httpd

1篇

目录

评论 4

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

基于C++的Ethernet帧结构解析程序开发111111 - 豆丁网

基于C++的Ethernet帧结构解析程序开发111111 - 豆丁网

拖拽LOGO到书签栏收藏网站(轻点去首页)

频道

升级大会员文档免费下

全国院校考研资料库

小学数学知识点精讲

上传

书房

登录

注册

创业

案例

会议

企业工具

专题

社区

APP

文档分类

建筑

资讯

资料

视频课堂

施组

方案

图纸

施工交底

考研

合同

报告

薪酬

在家学习

VIP会员

漫画

作文

总结

医疗

文档合伙人

扫一扫安装书房APP

扫一扫关注微信号

环保

基础教育

论文

中学教育

高等教育

外语学习

IT计算机

研究报告

办公文档

行业资料

生活休闲

幼儿/小学教育

研究生考试

建筑/环境

法律/法学

通信/电子

管理/人力资源

经济/贸易/财会

汽车/机械/制造

医学/心理学

资格/认证考试

金融/证券

文学/艺术/军事/历史

图书

杂志

会议

医疗

漫画

通信/电子  > 

电子电气自动化 > 

基于C++的Ethernet帧结构解析程序开发111111

1,640阅读

11人收藏

23页ladath0822上传

举报/认领

图片版合伙人(招募中)

展开

本文档由 ladath0822 分享于2012-06-12 10:10

本次课程设计主要是用C++语言来编写一个可以对Ethernet帧结构进行解析的程序,就是将帧结构中的二进制比特流数据解析出我们很容易理解的字节。

文档格式:

.doc

文档大小:

675.5K

文档页数:

23页

顶 /踩数:

0

1

收藏人数:

11

评论次数:

2

文档热度:

文档分类:

IT计算机

 — 

管理信息系统

添加到豆单

系统标签:

解析程序

ethernet

结构

wireshark

开发

数据包

下载文档

收藏

打印

分享赚钱赏

君,已阅读到文档的结尾了呢~~

立即下载

加入会员,超低价下载

分享赚钱赏

下载文档

加入会员

超低价下载

菜单

列表阅读

幻灯片阅读

书签

放大

缩小

评论

上传文档

文档信息

关于豆丁

全屏

上一页 /3下一页

扫扫二维码,随身浏览文档

手机或平板扫扫即可继续访问

推荐豆丁书房APP  扫扫更高清

分享文档

将文档分享至:

分享完整地址

文档地址:

复制

粘贴到BBS或博客

flash地址:

复制

支持嵌入FLASH地址的网站使用

html代码:

复制

默认尺寸450px*300px480px*400px650px*490px

支持嵌入HTML代码的网站使用

分享到

QQ空间

新浪微博

微信

QQ好友

更多...

豆丁提示

您的内容已经提交成功

您所提交的内容需要审核后才能发布,请您等待!

3秒自动关闭窗口

确定

以太网帧结构详解 - 知乎

以太网帧结构详解 - 知乎首发于网络协议详解切换模式写文章登录/注册以太网帧结构详解nwatch计算机的世界真是太精彩了!!!前言20世纪60年代以来,计算机网络得到了飞速发展。各大厂商和标准组织为了在数据通信网络领域占据主导地位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA协议,Novell公司的IPX/SPX协议,以及广泛流行的OSI参考模型和TCP/IP协议。同时,各大厂商根据这些协议生产出了不同的硬件和软件。标准组织和厂商的共同努力促进了网络技术的快速发展和网络设备种类的迅速增长。网络通信中,“协议”和“标准”这两个词汇常常可以混用。同时,协议或标准本身又常常具有层次的特点。一般地,关注于逻辑数据关系的协议通常被称为上层协议,而关注于物理数据流的协议通常被称为低层协议。IEEE 802就是一套用来管理物理数据流在局域网中传输的标准,包括在局域网中传输物理数据的802.3以太网标准。还有一些用来管理物理数据流在使用串行介质的广域网中传输的标准,如帧中继FR(Frame Relay),高级数据链路控制HDLC(High-Level Data Link Control),异步传输模式ATM(Asynchronous Transfer Mode)。分层模型- OSI不同的协议栈用于定义和管理不同网络的数据转发规则。国际标准化组织ISO于1984年提出了OSI RM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI 参考模型很快成为了计算机网络通信的基础模型。OSI参考模型具有以下优点:简化了相关的网络操作;提供了不同厂商之间的兼容性;促进了标准化工作;结构上进行了分层;易于学习和操作。OSI参考模型各个层次的基本功能如下:1.物理层: 在设备之间传输比特流,规定了电平、速度和电缆针脚。2.数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址(以太网使用MAC地址)来访问介质,并进行差错检测。3.网络层:提供逻辑地址,供路由器确定路径。4.传输层:提供面向连接或非面向连接的数据传递以及进行重传前的差错检测。5.会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。6.表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。7.应用层:OSI参考模型中最靠近用户的一层,为应用程序提供网络服务。分层模型– TCP/IPTCP/IP模型同样采用了分层结构,层与层相对独立但是相互之间也具备非常密切的协作关系。TCP/IP模型将网络分为四层。TCP/IP模型不关注底层物理介质,主要关注终端之间的逻辑数据流转发。TCP/IP模型的核心是网络层和传输层:网络层解决网络之间的逻辑转发问题,传输层保证源端到目的端之间的可靠传输。最上层的应用层通过各种协议向终端用户提供业务应用。数据封装应用数据需要经过TCP/IP每一层处理之后才能通过网络传输到目的端,每一层上都使用该层的协议数据单元PDU(Protocol Data Unit)彼此交换信息。不同层的PDU中包含有不同的信息,因此PDU在不同层被赋予了不同的名称。如上层数据在传输层添加TCP报头后得到的PDU被称为Segment(数据段 )数据段被传递给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包)数据包被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧)最后,帧被转换为比特(物理层)通过网络介质传输。这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。终端之间的通信数据链路层控制数据帧在物理链路上传输。数据包在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据包称为称为数据帧,数据帧中封装的信息决定了数据如何传输。以太网上传输的数据帧有两种格式,选择哪种格式由TCP/IP协议簇中的网络层决定。帧格式以太网上使用两种标准帧格式。第一种是上世纪80年代初提出的DIX v2格式,即Ethernet II帧格式。Ethernet II后来被IEEE 802标准接纳,并写进了IEEE 802.3x-1997的3.2.6节。第二种是1983年提出的IEEE 802.3格式。这两种格式的主要区别在于,Ethernet II格式中包含一个Type字段,标识以太帧处理完成之后将被发送到哪个上层协议进行处理。IEEE 802.3格式中,同样的位置是长度字段。不同的Type字段值可以用来区别这两种帧的类型当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536 (或者十六进制的0x0600)时,帧使用的是Ethernet II格式。以太网中大多数的数据帧使用的是Ethernet II格式。以太帧中还包括源和目的MAC地址,分别代表发送者的MAC和接收者的MAC,此外还有帧校验序列字段,用于检验传输过程中帧的完整性。Ethernet_II 帧格式Ethernet_II 帧类型值大于等于1536 (0x0600)以太网数据帧的长度在64-1518字节之间Ethernet_II的帧中各字段说明如下:DMAC(Destination MAC)是目的MAC地址。DMAC字段长度为6个字节,标识帧的接收者。SMAC(Source MAC)是源MAC地址。SMAC字段长度为6个字节,标识帧的发送者。类型字段(Type)用于标识数据字段中包含的高层协议,该字段长度为2个字节。类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0806的帧代表ARP协议帧。数据字段(Data)是网络层数据,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节。循环冗余校验字段(FCS)提供了一种错误检测机制。该字段长度为4个字节。IEEE802.3 帧格式IEEE 802.3 帧长度字段值小于等于1500 (0x05DC)IEEE 802.3帧格式类似于Ethernet_II帧,只是Ethernet_II帧的Type域被802.3帧的Length域取代,并且占用了Data字段的8个字节作为LLC和SNAP字段。Length字段定义了Data字段包含的字节数。逻辑链路控制LLC(Logical Link Control)由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。SNAP(Sub-network Access Protocol)由机构代码(Org Code)和类型(Type)字段组成。Org code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。IEEE802.3帧根据DSAP和SSAP字段的取值又可分为以下几类:当DSAP和SSAP都取特定值0xff时,802.3帧就变成了Netware-ETHERNET帧,用来承载NetWare类型的数据。当DSAP和SSAP都取特定值0xaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。DSAP和SSAP其他的取值均为纯IEEE802.3帧。数据帧传输数据链路层基于MAC地址进行帧的传输以太网在二层链路上通过MAC地址来唯一标识网络设备,并且实现局域网上网络设备之间的通信。MAC地址也叫物理地址,大多数网卡厂商把MAC地址烧入了网卡的ROM中。发送端使用接收端的MAC地址作为目的地址。以太帧封装完成后会通过物理层转换成比特流在物理介质上传输。以太网的MAC地址MAC地址由两部分组成,分别是供应商代码和序列号。其中前24位代表该供应商代码,由IEEE管理和分配。剩下的24位序列号由厂商自己分配。如同每一个人都有一个名字一样,每一台网络设备都用物理地址来标识自己,这个地址就是MAC地址。网络设备的MAC地址是全球唯一的。MAC地址长度为48比特,通常用十六进制表示。MAC地址包含两部分:前24比特是组织唯一标识符(OUI,Organizationally Unique Identifier),由IEEE统一分配给设备制造商。例如,华为的网络产品的MAC地址前24比特是0x00e0fc。后24位序列号是厂商分配给每个产品的唯一数值,由各个厂商自行分配(这里所说的产品可以是网卡或者其他需要MAC地址的设备)。数据帧的发送和接收单播局域网上的帧可以通过三种方式发送。第一种是单播,指从单一的源端发送到单一的目的端。每个主机接口由一个MAC地址唯一标识,MAC地址的OUI中,第一字节第8个比特表示地址类型。对于主机MAC地址,这个比特固定为0,表示目的MAC地址为此MAC地址的帧都是发送到某个唯一的目的端。在冲突域中,所有主机都能收到源主机发送的单播帧,但是其他主机发现目的地址与本地MAC地址不一致后会丢弃收到的帧,只有真正的目的主机才会接收并处理收到的帧。广播第二种发送方式是广播,表示帧从单一的源发送到共享以太网上的所有主机。广播帧的目的MAC地址为十六进制的FF:FF:FF:FF:FF:FF,所有收到该广播帧的主机都要接收并处理这个帧。广播方式会产生大量流量,导致带宽利用率降低,进而影响整个网络的性能。当需要网络中的所有主机都能接收到相同的信息并进行处理的情况下,通常会使用广播方式。组播第三种发送方式为组播,组播比广播更加高效。组播转发可以理解为选择性的广播,主机侦听特定组播地址,接收并处理目的MAC地址为该组播MAC地址的帧。组播MAC地址和单播MAC地址是通过第一字节中的第8个比特区分的。组播MAC地址的第8个比特为1,而单播MAC地址的第8个比特为0。当需要网络上的一组主机(而不是全部主机)接收相同信息,并且其他主机不受影响的情况下,通常会使用组播方式。发送与接收当主机接收到的数据帧所包含的目的MAC地址是自己时,会把以太网封装剥掉后送往上层协议。帧从主机的物理接口发送出来后,通过传输介质传输到目的端。共享网络中,这个帧可能到达多个主机。主机检查帧头中的目的MAC地址,如果目的MAC地址不是本机MAC地址,也不是本机侦听的组播或广播MAC地址,则主机会丢弃收到的帧。如果目的MAC地址是本机MAC地址,则接收该帧,检查帧校验序列(FCS)字段,并与本机计算的值对比来确定帧在传输过程中是否保持了完整性。如果帧的FCS值与本机计算的值不同,主机会认为帧已被破坏,并会丢弃该帧。如果该帧通过了FCS校验,则主机会根据帧头部中的Type字段来确定将帧发送给上层哪个协议处理。实际数据包分析:ARP类型数据包其他类型数据包:原文链接;以太网帧结构详解_曌赟的博客-CSDN博客发布于 2020-10-12 11:16计算机网络网络通信数据通信​赞同 53​​1 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录网络协议详解网络协

Ethernet帧结构解析 - 百度文库

Ethernet帧结构解析 - 百度文库

新建

上传

最近

收藏

下载

新客立减

登录

Ethernet帧结构解析 

计算机网络课程设计任务书11-ethernet帧结构解析及crc校验的实现 - 道客巴巴

计算机网络课程设计任务书11-ethernet帧结构解析及crc校验的实现 - 道客巴巴

图案背景

纯色背景

首页

文档

行业资料

考试资料

教学课件

学术论文

技术资料

金融财经

研究报告

法律文献

管理文献

社会科学

生活休闲

计算机

经济文库

数字媒体

教材教辅

企业档案

任务

文辑

阅读器

 上传文档

 下载

 打印

/ 1

视图设置

单页

双页

全屏

恢复

缩略图

幻灯片

视图

标记

批注

搜本文档

搜全站

1 / 1

批注本地保存成功,开通会员云端永久保存 去开通 

标记设置

高亮

下划线

删除线

波浪线

画笔设置

线条颜色

字体设置

微软雅黑

微软雅黑

宋体

黑体

楷体

Arial

文字大小

透明度

线条粗细

贝波

上传于:2017-06-04

粉丝量:32

计量、质量管理体系、质量手册、程序文件、医药、食品安全,法律法规、生活常识、销售管理、国学、论文等专业文档。知识改变世界,知识让你我成长。部分文档为本人收集整理,如有(疑似)侵权,请联系我或道客客服删除。



 下载此文档

 直接下载

相关

目录

笔记

书签

更多相关文档

正在努力加载中...

暂无目录

点击鼠标右键菜单,创建目录

新建

编辑

删除

暂无笔记

选择文本,点击鼠标右键菜单,添加笔记

暂无书签

在左侧文档中,点击鼠标右键,添加书签

计算机网络课程设计任务书11-ethernet帧结构解析及crc校验的实现

格式:DOC

页数:1

上传日期:2017-06-04 00:00:08

浏览次数:100

1200积分

 用阅读器打开

 加入阅读清单

成功点赞+1

全文阅读已结束,下载本文需要使用

 1200 积分

下载此文档

VIP用户免费下载XDF文档

下载稻壳阅读器阅读此文档

阅读了该文档的用户还阅读了这些文档

计算机网络课程设计任务书11-ethernet帧结构解析及c

关于我们

关于道客巴巴

人才招聘

联系我们

网站声明

网站地图

APP下载

帮助中心

会员注册

文档下载

如何获取积分

关注我们

新浪微博

关注微信公众号

道客巴巴网站 版权所有  | ©2008-2024  |  网站备案:京ICP备18056798号-1  京公网安备11010802036365号

0

阅读清单

微信阅读

APP阅读

返回顶部

C++ Exercises(十六)---Ethernet帧包结构解析-阿里云开发者社区

C++ Exercises(十六)---Ethernet帧包结构解析-阿里云开发者社区

产品解决方案文档与社区权益中心定价云市场合作伙伴支持与服务了解阿里云联系我们4008013260售前咨询售后服务其他服务我要建议我要投诉备案控制台开发者社区首页探索云世界探索云世界云上快速入门,热门云上应用快速查找了解更多问产品动手实践考认证TIANCHI大赛活动广场活动广场丰富的线上&线下活动,深入探索云世界任务中心做任务,得社区积分和周边高校计划让每位学生受益于普惠算力训练营资深技术专家手把手带教话题畅聊无限,分享你的技术见解开发者评测最真实的开发者用云体验乘风者计划让创作激发创新阿里云MVP遇见技术追梦人直播技术交流,直击现场下载下载海量开发者使用工具、手册,免费下载镜像站极速、全面、稳定、安全的开源镜像技术资料开发手册、白皮书、案例集等实战精华插件为开发者定制的Chrome浏览器插件探索云世界新手上云云上应用构建云上数据管理云上探索人工智能云计算弹性计算无影存储网络倚天云原生容器serverless中间件微服务可观测消息队列数据库关系型数据库NoSQL数据库数据仓库数据管理工具PolarDB开源向量数据库热门Modelscope模型即服务弹性计算云原生数据库物联网云效DevOps龙蜥操作系统平头哥钉钉开放平台大数据大数据计算实时数仓Hologres实时计算FlinkE-MapReduceDataWorksElasticsearch机器学习平台PAI智能搜索推荐人工智能机器学习平台PAI视觉智能开放平台智能语音交互自然语言处理多模态模型pythonsdk通用模型开发与运维云效DevOps钉钉宜搭支持服务镜像站码上公益

开发者社区

开发与运维

文章

正文

C++ Exercises(十六)---Ethernet帧包结构解析

2018-01-08

1464

版权

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《

阿里云开发者社区用户服务协议》和

《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写

侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介:

图1是一个假想的帧包结构,

图2是解包后的结果。

复制代码

/////////////////////////////

///帧信息类 

/////////////////////////////

class CFrame

{

public:

    CFrame(void);

    ~CFrame(void);

    void setSerialNumber(int nSN);

    void setPreCode(const string& strPreCode);

    void setPreBoundCode(const string& strBoundCode);

    void setEtherType(const string& strEtherType);

    void setData(char* strData,int len);

    void setCRC(const string& strCRC);

    void setFrameState(bool isValid);

    void setDstAddress(const string& desAddress);

    void setSrcAddress(const string& srcAddress);

private:

    int nFrameSN;// 帧序号

    string strPreCode;//前导码

    string strPreBoundCode;//帧前定界符

    string strDstAddress;//目的地址

    string strSrcAddress;//源地址

    string strEtherType;//帧类型

    string strData;//数据域

    string strCRC;//CRC校验码

    bool bIsValid;//是否正确的帧

    friend ostream& operator << (ostream& out,const CFrame& frame);

};

CFrame::CFrame(void)

{

    this->nFrameSN = -1;

    this->bIsValid = false;

    this->strEtherType = "";

    this->strCRC = "";

    this->strData = "";

    this->strDstAddress = "";

    this->strPreBoundCode = "";

    this->strPreCode = "";

    this->strSrcAddress = "";

}

CFrame::~CFrame(void)

{

}

void CFrame::setSerialNumber(int nSN)

{

    this->nFrameSN = nSN;

}

void CFrame::setPreCode(const string& strPreCode)

{

    this->strPreCode = strPreCode;

}

void CFrame::setPreBoundCode(const string& strBoundCode)

{

    this->strPreBoundCode = strBoundCode;

}

void CFrame::setEtherType(const string& strEtherType)

{

    this->strEtherType = strEtherType;

}

void CFrame::setData(char* strData,int len)

{

    this->strData = string(strData,len);

}

void CFrame::setCRC(const string& strCRC)

{

    this->strCRC = strCRC;

}

void CFrame::setFrameState(bool isValid)

{

    this->bIsValid = isValid;

}

void CFrame::setDstAddress(const string& desAddress)

{

    this->strDstAddress = desAddress;

}

void CFrame::setSrcAddress(const string& srcAddress)

{

    this->strSrcAddress = srcAddress;

}

复制代码

 

复制代码

/////////////////////////////

///帧解析器类

///////////////////////////

class CFrameParser

{

public:

    CFrameParser(void);

    CFrameParser(const char* pFilePath);

    CFrameParser(const string& strFilePath);

    ~CFrameParser(void);

    bool DoParser();//实际的解析动作

private:

    string strInputFile;//帧数据文件

    vector vecFrames;//帧包列表

    

};

CFrameParser::CFrameParser(void)

{

}

CFrameParser::~CFrameParser(void)

{

}

CFrameParser::CFrameParser(const char* pFilePath):strInputFile(pFilePath)

{

}

CFrameParser::CFrameParser(const string& strFilePath):strInputFile(strFilePath)

{

}

bool CFrameParser::DoParser()

{    // 检测输入文件是否存在,并可以按所需的权限和方式打开

    ifstream file(this->strInputFile.c_str(), ios::in|ios::binary|ios::_Nocreate);

    if (!file.is_open())

    {

        cout << "无法打开帧封装包文件,请检查文件是否存在并且未损坏" << endl;

        return false;

    }

    

    // 变量声明及初始化

    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++)                // 找个连续的xaa

        {            

            if (file.tellg() >= nFileEnd)        // 安全性检测

            {

                cout<<"没有找到合法的帧"<

                file.close();

                return false;

            }

            // 看当前字符是不是xaa,如果不是,则重新寻找个连续的xaa

            if (file.get() != 0xaa)                

            {

                j = -1;

            }

        }

        if (file.tellg() >= nFileEnd)            // 安全性检测

        {

            cout<<"没有找到合法的帧"<

            file.close();

            return false;

        }

        if (file.get() == 0xab)                    // 判断个连续的xaa之后是否为xab

        {

            break;

        }

    }

    // 将数据字段偏移量定位在上述二进制串之后字节处,并准备进入解析阶段

    nCurrDataOffset = static_cast(file.tellg()) + 14;

    file.seekg(-8,ios::cur);

    // 主控循环

    while ( bParseCont ) // 当仍然可以继续解析输入文件时,继续解析

    {

        // 检测剩余文件是否可能包含完整帧头

        if (static_cast(file.tellg())+ 14 > nFileEnd)// 从目的字段到类型字段总共14字节

        {

            cout<

            file.close();

            return false;

        }

        CFrame frame;

        int c;                        // 读入字节

        int i = 0;                    // 循环控制变量                    

        int EtherType = 0;            // 由帧中读出的类型字段

        bool bAccept = true;        // 是否接受该帧

        // 输出帧的序号

        frame.setSerialNumber(nSN);

        // 输出前导码,只输出,不校验

        string tmpPreCode="";

        for (i = 0; i <7; i++)                    // 输出格式为:AA AA AA AA AA AA AA

        {

            c = file.get();

            string hexCode = util::ConvertToHex(c);

            tmpPreCode.append(hexCode);

            if (i!=6)

            {

                tmpPreCode.append(1,' ');

            }

        }

        frame.setPreCode(tmpPreCode);

        // 输出帧前定界符,只输出,不校验

        cout << endl << "帧前定界符:\t";        

        cout.width(2);                            // 输出格式为:AB

        c = file.get();

        string tmpBoundCode = util::ConvertToHex(c);

        frame.setPreBoundCode(tmpBoundCode);

        string tmpDesAddress;

        // 输出目的地址,并校验

        for (i = 1; i <=6; i++)                    // 输出格式为:xx-xx-xx-xx-xx-xx

        {

            c = file.get();

            string desAddr = util::ConvertToHex(c);

            tmpDesAddress.append(desAddr);

            if (i!=6)

            {

                tmpDesAddress.append(1,'-');

            }

            if (i == 1)                            // 第一个字节,作为“余数”等待下一个bit

            {

                nCheck = c;

            }

            else                                // 开始校验

            {

                util::CRC::checkCRC(nCheck, c);

            }

        }

        frame.setDstAddress(tmpDesAddress);

        string tmpSrcAddress;

        // 输出源地址,并校验

        for (i = 1; i <=6; i++)                    // 输出格式为:xx-xx-xx-xx-xx-xx

        {

            c = file.get();

            string srcAddr = util::ConvertToHex(c);

            tmpSrcAddress.append(srcAddr);

            if (i!=6)

            {

                tmpSrcAddress.append(1,'-');

            }

            util::CRC::checkCRC(nCheck, c);                // 继续校验

        }

        frame.setSrcAddress(tmpSrcAddress);

        //// 输出类型字段,并校验                            

        // 输出类型字段的高位

        c = file.get();

        util::CRC::checkCRC(nCheck, c);                    // CRC校验

        EtherType = c;

        // 输出类型字段的低位

        c = file.get();                        

        util::CRC::checkCRC(nCheck,c);                        // CRC校验

        EtherType <<= 8;                        // 转换成主机格式

        EtherType |= c;

        string tmpType = util::ConvertToType(EtherType);

        frame.setEtherType(tmpType);

        // 定位下一个帧,以确定当前帧的结束位置

        while ( bParseCont )

        {

            for (int i = 0; i < 7; i++)                    //找下一个连续的个xaa

            {                

                if (file.tellg() >= nFileEnd)            //到文件末尾,退出循环

                {

                    bParseCont = false;

                    break;

                }

                // 看当前字符是不是xaa,如果不是,则重新寻找个连续的xaa

                if (file.get() != 0xaa)

                {

                    i = -1;

                }

            }

            // 如果直到文件结束仍没找到上述比特串,将终止主控循环的标记bParseCont置为true

            bParseCont = bParseCont && (file.tellg() < nFileEnd);        

            // 判断个连续的xaa之后是否为xab

            if (bParseCont && file.get() == 0xab)        

            {

                break;

            }

        }

        // 计算数据字段的长度

        nCurrDataLength =                                

            bParseCont ?                                // 是否到达文件末尾

            (static_cast(file.tellg()) - 8 - 1 - nCurrDataOffset) :    // 没到文件末尾:下一帧头位置- 前导码和定界符长度- CRC校验码长度- 数据字段起始位置

        (static_cast(file.tellg()) - 1 - nCurrDataOffset);        // 已到达文件末尾:文件末尾位置- CRC校验码长度- 数据字段起始位置

        // 以文本格式数据字段,并校验

        char* pData = new char[nCurrDataLength];    // 创建缓冲区

        file.seekg(bParseCont ? (-8 - 1 -nCurrDataLength) : ( -1 - nCurrDataLength), ios::cur);

        file.read(pData, nCurrDataLength);                // 读入数据字段

        frame.setData(pData,nCurrDataLength);

        int nCount = 50;                                // 每行的基本字符数量

        for (i = 0; i < nCurrDataLength; i++)            // 输出数据字段文本    

        {

            util::CRC::checkCRC(nCheck, (int)pData[i]);            // CRC校验

        }

        delete[] pData;                                    //释放缓冲区空间

        // 输出CRC校验码,如果CRC校验有误,则输出正确的CRC校验码

        cout << endl <<"CRC校验";

        c = file.get();                                // 读入CRC校验码

        int nTmpCRC = nCheck;

        util::CRC::checkCRC(nCheck, c);                        // 最后一步校验

        string strCRC = util::ConvertToHex(c);

        frame.setCRC(strCRC);

        if ((nCheck & 0xff) != 0)                    // CRC校验无误

        {

            bAccept = false;                        // 将帧的接收标记置为false

        }

        //    如果数据字段长度不足字节或数据字段长度超过字节,则将帧的接收标记置为false    

        if (nCurrDataLength < 46 ||    nCurrDataLength > 1500 )                            

        {

            bAccept = false;

        }

        frame.setFrameState(bAccept);

        vecFrames.push_back(frame);

        nSN++;                                    // 帧序号加

        nCurrDataOffset = static_cast(file.tellg()) + 22;    // 将数据字段偏移量更新为下一帧的帧头结束位置

    }

    // 关闭输入文件

    file.close();

    return true;

}

复制代码

 

复制代码

namespace util

{//实用工具

    class CRC

    {

    public:

    ////////////////////////////////////////////////////////////////////////////////

        // CRC校验,在上一轮校验的基础上继续作位CRC校验

        // 

        //    输入参数:

        //        chCurrByte    低位数据有效,记录了上一次CRC校验的余数

        //        chNextByte    低位数据有效,记录了本次要继续校验的一个字节

        //

        //    传出参数:

        //        chCurrByte    低位数据有效,记录了本次CRC校验的余数

        ////////////////////////////////////////////////////////////////////////////////

        static void checkCRC(int &chCurrByte, int chNextByte)

        {

            // CRC循环:每次调用进行次循环,处理一个字节的数据。

            for (int nMask = 0x80; nMask > 0; nMask >>= 1)

            {

                if ((chCurrByte & 0x80) != 0)        // 首位为1:移位,并进行异或运算            {    

                    chCurrByte <<= 1;                // 移一位

                    if ( (chNextByte & nMask) != 0)    // 补一位

                    {

                        chCurrByte |= 1;

                    }

                    chCurrByte ^= 7;                // 首位已经移出,仅对低位进行异或运算,的二进制为,0111

                }

                else                                // 首位为0,只移位,不进行异或运算

                {        

                    chCurrByte <<= 1;                // 移一位

                    if ( (chNextByte & nMask) != 0)    // 补一位

                    {

                        chCurrByte |= 1;

                    }

                }

            }

        }

    };

    char mappingTable[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

    string ConvertToHex(int ch)

    {

        int high = ch/16;

        int low = ch%16;

        string result;

        result.append(1,mappingTable[high]);

        result.append(1,mappingTable[low]);

        return result;

    }

    string ConvertToType(int ch)

    {

        string result;

        int num,i;

        for (i=0;i<4;++i)

        {

            num = ch & 0x000F;

            ch>>=4;

            result.append(1,mappingTable[num]);

            if (i==1)

            {

                result.append(1,' ');

            }

        }

        

        for (i=0;i<=1;++i)

        {

            swap(result[i],result[4-i]);

        }

        return result;

    }

}

复制代码

本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/01/03/1367516.html,如需转载请自行联系原作者

嗯哼9925

目录

热门文章

最新文章

为什么选择阿里云什么是云计算全球基础设施技术领先稳定可靠安全合规分析师报告产品和定价全部产品免费试用产品动态产品定价价格计算器云上成本管理解决方案技术解决方案文档与社区文档开发者社区天池大赛培训与认证权益中心免费试用高校计划企业扶持计划推荐返现计划支持与服务基础服务企业增值服务迁云服务官网公告健康看板信任中心关注阿里云关注阿里云公众号或下载阿里云APP,关注云资讯,随时随地运维管控云服务联系我们:4008013260法律声明Cookies政策廉正举报安全举报联系我们加入我们阿里巴巴集团淘宝网天猫全球速卖通阿里巴巴国际交易市场1688阿里妈妈飞猪阿里云计算AliOS万网高德UC友盟优酷钉钉支付宝达摩院淘宝海外阿里云盘饿了么© 2009-2024 Aliyun.com 版权所有 增值电信业务经营许可证: 浙B2-20080101 域名注册服务机构许可: 浙D3-20210002 京D3-20220015浙公网安备 33010602009975号浙B2-20080101-4

第2章 Ethernet帧结构 解析程序 - 豆丁网

第2章 Ethernet帧结构 解析程序 - 豆丁网

拖拽LOGO到书签栏收藏网站(轻点去首页)

频道

小学数学知识点精讲

升级大会员文档免费下

全国院校考研资料库

上传

书房

登录

注册

创业

案例

会议

企业工具

专题

社区

APP

文档分类

建筑

资讯

资料

视频课堂

施组

方案

图纸

施工交底

考研

合同

报告

薪酬

在家学习

VIP会员

漫画

作文

总结

医疗

文档合伙人

扫一扫安装书房APP

扫一扫关注微信号

环保

基础教育

论文

中学教育

高等教育

外语学习

IT计算机

研究报告

办公文档

行业资料

生活休闲

幼儿/小学教育

研究生考试

建筑/环境

法律/法学

通信/电子

管理/人力资源

经济/贸易/财会

汽车/机械/制造

医学/心理学

资格/认证考试

金融/证券

文学/艺术/军事/历史

图书

杂志

会议

医疗

漫画

通信/电子  > 

电子设计 > 

第2章 Ethernet帧结构 解析程序

329阅读

19页企管精品上传

举报/认领

图片版合伙人(招募中)

展开

本文档由 企管精品 分享于2012-02-25 13:30

第2章 Ethernet帧结构 解析程序以太网,2,8

文档格式:

.ppt

文档大小:

439.0K

文档页数:

19页

顶 /踩数:

0

0

收藏人数:

0

评论次数:

0

文档热度:

文档分类:

通信/电子

 — 

电子设计

添加到豆单

文档标签:

以太网

2

8

系统标签:

ethernet

解析程序

多项式

编程技术

crc

校验

下载文档

收藏

打印

分享赚钱赏

君,已阅读到文档的结尾了呢~~

立即下载

加入会员,超低价下载

分享赚钱赏

下载文档

加入会员

超低价下载

菜单

列表阅读

幻灯片阅读

书签

放大

缩小

评论

上传文档

文档信息

关于豆丁

全屏

上一页 /3下一页

扫扫二维码,随身浏览文档

手机或平板扫扫即可继续访问

推荐豆丁书房APP  扫扫更高清

分享文档

将文档分享至:

分享完整地址

文档地址:

复制

粘贴到BBS或博客

flash地址:

复制

支持嵌入FLASH地址的网站使用

html代码:

复制

默认尺寸450px*300px480px*400px650px*490px

支持嵌入HTML代码的网站使用

分享到

QQ空间

新浪微博

微信

QQ好友

更多...

豆丁提示

您的内容已经提交成功

您所提交的内容需要审核后才能发布,请您等待!

3秒自动关闭窗口

确定

C++ Exercises(十六)---Ethernet帧包结构解析-CSDN博客

>

C++ Exercises(十六)---Ethernet帧包结构解析-CSDN博客

C++ Exercises(十六)---Ethernet帧包结构解析

最新推荐文章于 2023-06-27 22:47:33 发布

VIP文章

云栖精选

最新推荐文章于 2023-06-27 22:47:33 发布

阅读量640

收藏

3

点赞数

2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/yunqishequ1/article/details/79012691

版权

复制代码

/

///帧信息类 

/

class CFrame

{

public:

    CFrame(void);

    ~CFrame(void);

    void setSerialNumber(int nSN);

    void setPreCode(const string& strPreCode);

    void setPreBoundCode(const string& strBoundCode);

    void setEtherType(const string& strEtherType);

    void setData(char* strData,int len);

    void setCRC(const string& strCRC);

    void setFrameState(bool isValid);

    void setDstAddress(const string& desAddress);

    void setSrcAddress(const string& srcAddress);

private:

    int nFrameSN;// 帧序号

    string strPreCode;//前导码

    string strPreBoundCode;//帧前定界符

    string strDstAddress;//目的地址

    string strSrcAddress;//源地址

    string strEtherType;//帧类型

    string strData;//数据域

    string strCRC;//CRC校验码

    bool bIsValid;//是否正确的帧

    friend ostream& operator << (ostream& out,const CFrame& frame);

};

CFrame::CFrame(void)

{

    this->nFrameSN = -1;

    this->bIsValid = false;

    this->strEtherType = "";

    this->strCRC = "";

    this->strData = "";

    this->strDstAddress = "";

    this->strPreBoundCode = "";

    this->strPreCode = "";

    this->strSrcAddress = "";

}

CFrame::~CFrame(void)

{

}

void CFrame::setSerialNumber(int nSN)

{

    this->nFrameSN = nSN;

}

void CFrame::setPreCode(const string& strPreCode)

{

    this->strPreCode = strPreCode;

}

void CFrame::setPreBoundCode(const string& strBoundCode)

{

    this->strPreBoundCode = strBoundCode;

}

void CFrame::setEtherType(const string& strEtherType)

{

    this->strEtherType = strEtherType;

}

void CFrame::setData(char* strData,int len)

{

    this->strData = string(strData,len);

}

void CFrame::setCRC(const string& strCRC)

{

    this->strCRC = strCRC;

}

void CFrame::setFrameState(bool isValid)

{

    this->bIsValid = isValid;

}

void CFrame::setDstAddress(const string& desAddress)

{

    this->strDstAddress = desAddress;

}

void CFrame::setSrcAddress(const string& srcAddress)

{

    this->strSrcAddress = srcAddress;

}

复制代码

最低0.47元/天 解锁文章

优惠劵

云栖精选

关注

关注

2

点赞

3

收藏

觉得还不错?

一键收藏

知道了

0

评论

C++ Exercises(十六)---Ethernet帧包结构解析

复制代码////////////////////////////////帧信息类 /////////////////////////////class CFrame{public:    CFrame(void);    ~CFrame(void);    void setSerialNumber(int nSN); 

复制链接

扫一扫

C++ 帧封装与帧解析

10-19

花了一周时间做的,网上已经有类似资源,但没有封装,而且本代码跟网上已有资源绝不雷同。

C语言中如何实现数据帧封装与解析

我点评的博客

08-13

604

通过定义数据帧的结构体,并编写相应的封装和解析函数,我们可以实现数据帧在C语言中的处理。数据帧的封装和解析是网络通信中必不可少的环节,在实际应用中需要根据具体的需求进行适当的扩展和优化。数据帧的封装与解析是为了将数据按照一定的格式打包和解析,以确保数据的可靠传输和正确解析。在这个函数中,我们将数据帧中的目的地址、源地址、数据长度和数据内容解析出来,并计算出接收到的帧检验序列和计算得到的帧检验序列进行比较,以确保数据的完整性和正确性。数据帧的解析过程是将接收到的数据帧按照一定的格式解析成上层应用数据。

参与评论

您还未登录,请先

登录

后发表或查看评论

【计算机网络微课堂】3.2 封装成帧

qq_46470984的博客

07-17

636

以太网V2的MAC帧没有帧定界标志,通过物理层添加前导码识别是否是前导码,然后通过帧间间隔取出完整帧。就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。PPP帧包含帧定界标志,可以通过标志将每一个帧取出。帧头和帧尾包含重要的控制信息。,就好像数据链路层不存在一样。帧头和帧尾的作用之一就是。...

网络协议分析(一)(C语言实现---ethernet、arp、ip、icmp、udp、tcp)

qq_62169455的博客

06-27

2022

3)第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。发起请求的主机接收到响应包后,将目标IP地址和MAC地址添加到自己的ARP缓存中,并使用该MAC地址发送数据包到目标主机。以此来实现物理层数据传输。

Exercises-handson-circuits.zip

04-02

Exercises-handson-circuits.zip 介绍了关于Exercises-handson-circuits.zip的详细说明,提供其它知识的技术资料的下载。

Exercises_CD-BasedTraining_exercises_BasicsI_

09-29

LabVIEW Basics I CD-Based Training

python-exercises:竞争性编程练习

03-14

python练习 该文件夹不是那么重要:它仅包含一组练习,以训练自己编写高效的算法。

tensorflow-exercises:TensorFlow练习-专注于与NumPy的比较

02-06

TensorFlow练习截至2017年,TensorFlow无疑是最受欢迎的深度学习库。 旨在帮助那些想熟悉TensorFlow功能的人。 特别是,我专注于将TensorFlow函数与事实上的标准数值计算库NumPy中的等效函数进行比较。...

javascript-developer-exercises:一些简单JavaScript开发人员采访练习

05-05

javascript-developer-exercises 一些JavaScript开发人员练习将其用作求职面试的前置屏幕 只需分叉此存储库(或下载它),然后查看exercises文件夹中的每个文件。 该怎么办 每个练习都将包含一些代码的外壳,以及在...

C++ Ethernet帧封装_解析_多线程模拟发送消息

03-15

摘要:VC/C++源码,系统相关,多线程

C++ Ethernet帧封装_解析_模拟发送,分为单线程模拟发送和多线程模拟发送,压缩包中有供测试用的可执行程序和源代码文件,测试字符串NankaiU.txt是发消息时用的。

运行环境:Windows/Visual C/C++

C++实现Frame帧结构构建解析程序

10-31

本次实验的目的首先是根据数据链路层的相关知识和数据链路层通信的基本原理,解析已经封装好的Ethernet帧,从而了解Ethernet帧结构的各个字段的含义以及帧的接收过程,更加深刻的了解数据链路层协议;其次就是熟悉C++开发语言,掌握基本的编程技术。

帧的封装与解析 (以太网帧结构)

11-05

帧是如何封装和解析的

初学者可以参考一下

以太网帧解析程序

05-11

完整的以太网帧解析程序,使用C++完成,可直接运行,内含程序源码与说明文档。

c++做的帧封装和解析程序

10-16

可以用,c++做的,帧的封装和解析程序,代码有注释。

以太网帧、IP报文格式

weixin_40333655的博客

09-11

879

转载https://www.cnblogs.com/yongren1zu/p/6274460.html

这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的。

以太网帧头部的数据结构:

typedef struct {

unsigned char dest_mac[6];

unsigned c...

程序流程图 解析数据帧4

04-06

程序流程图 解析数据帧程序流程图 解析数据帧程序流程图 解析数据帧程序流程图 解析数据帧

ethernet帧的封装、发送与解析

11-28

此程序的功能是接收帧进行解析,封装帧并进行模拟发送,在vs2010中完成的,希望会对你有所帮助!

东北石油大学331社会工作原理 2021年考研专业课初试大纲.pdf

最新发布

03-13

东北石油大学考研初试大纲

linux-programming-interface-exercises

09-24

《Linux编程接口练习》是一本关于Linux编程接口的练习题集。该书旨在帮助读者深入了解Linux操作系统的内部机制和API接口,提高他们在Linux环境下编写高效、可靠和安全的程序的能力。 这本书包含了大量的练习题,...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

云栖精选

CSDN认证博客专家

CSDN认证企业博客

码龄8年

暂无认证

34

原创

23万+

周排名

152万+

总排名

151万+

访问

等级

1万+

积分

1060

粉丝

166

获赞

51

评论

503

收藏

私信

关注

热门文章

二战时图灵机破译的Enigma密码,现在AI仅需13分钟便可破译

22849

聊一聊数据仓库中的元数据管理系统

21446

机器学习--线性代数基础

19818

怎么打造属于自己的天猫精灵

19642

一文读懂「Attention is All You Need」| 附代码实现

17138

分类专栏

电商

16篇

大数据

207篇

java

57篇

阿里云

35篇

安卓

8篇

docker

8篇

mongodb

5篇

游戏

前端

20篇

datav

4篇

php

11篇

MySQL

4篇

ORACLE

3篇

php,Linux

4篇

H5

1篇

python

14篇

C语言

10篇

UI

1篇

算法

8篇

人工智能

13篇

架构

12篇

数据库

11篇

wulia

物联网

4篇

AI

3篇

测试

9篇

开发环境

5篇

HTTPS

2篇

imags

1篇

javascript

1篇

服务器

2篇

性能

4篇

SPDY

1篇

windows

4篇

Image

3篇

机器x

1篇

机器学习

7篇

Redis

1篇

阅读

5篇

建站

7篇

网络传输

5篇

CSS

最新评论

PostgreSQL 对称加密、非对称加密用法介绍

王林森:

mark,two win.

使用阿里云PCDN降低内容分发成本

普通网友:

pcdn不合规不合法,该查该罚该办

MySQL · 数据恢复 · undrop-for-innodb

8斤草鱼:

我尝试在5.7版本的数据库恢复数据时,在导入数据过程中报了字符集编码问题(简单数据可以恢复,表数据复杂字段多的时候就会出现乱码问题),这是不是文件格式问题造成的?

300万知乎多标签文本分类任务经验分享(附源码)

Hu_guanfeng:

博主请问有源码吗?

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

作为前端Web开发者,这12条基本命令不可不会

Web前端面试宝典(最新)

Spring MVC原理

2018年221篇

2017年1223篇

2016年23篇

目录

目录

分类专栏

电商

16篇

大数据

207篇

java

57篇

阿里云

35篇

安卓

8篇

docker

8篇

mongodb

5篇

游戏

前端

20篇

datav

4篇

php

11篇

MySQL

4篇

ORACLE

3篇

php,Linux

4篇

H5

1篇

python

14篇

C语言

10篇

UI

1篇

算法

8篇

人工智能

13篇

架构

12篇

数据库

11篇

wulia

物联网

4篇

AI

3篇

测试

9篇

开发环境

5篇

HTTPS

2篇

imags

1篇

javascript

1篇

服务器

2篇

性能

4篇

SPDY

1篇

windows

4篇

Image

3篇

机器x

1篇

机器学习

7篇

Redis

1篇

阅读

5篇

建站

7篇

网络传输

5篇

CSS

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值