⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framehandler.h

📁 对以太帧进行手动封装
💻 H
字号:
#ifndef FRAMEHANDLER_H
#define FRAMEHANDLER_H

// 定义结构体FrameFront来表示Ethernet帧的数据段之前的部分
// 即包括:7Bytes的前导码、1Byte的帧前定位符、6Bytes的目的MAC地址、6Bytes的源MAC地址、2Bytes的数据段长度
// 该结构体不包括数据段和CRC字段
struct FrameFront
{
	unsigned char preamble[8];		// 前7个字节为前导码,正确值应为十六进制的AA-AA-AA-AA-AA-AA-AA,
									// 最后一个字节为帧前定位符,正确值应为十六进制的AB
	unsigned char destMAC[6];		// 目的MAC地址,该字段的长度6Bytes
	unsigned char srcMAC[6];		// 源MAC地址,该字段的长度为6Bytes
	unsigned char dataLength[2];    // 数据段的长度,该字段长度为2Bytes
};

// 定义类FrameHandler来处理帧的解析与封装
class FrameHandler
{
public:
	// 接口
	FrameHandler(bool isPackaging, const char* filePath);  // 构造函数,需指定操作类型(true为封装,false为解析)
														   // 和文件路径(相对路径)
	~FrameHandler();									   // 析构函数,释放已申请的资源
	bool package();										   // 将用户输入的信息封装成帧,保存在filePath指定的文件中
	bool unpackage();									   // 从成员变量filePath指定的文件中解析Ethernet帧

protected:
	// 内部辅助函数
	bool isLegalPreamble(const unsigned char* preamble);  // 判断给定帧的前导码以及帧前定位符是否合法,
														  // 即是否为十六进制的AA-AA-AA-AA-AA-AA-AA-AB
	unsigned char getCRC(const FrameFront& frameFront, const unsigned char* data);	// 计算crc校验码,调用generateCRC()完成
	unsigned char generateCRC(const unsigned char* dataForCRC, int length);   // 实际完成CRC校验码的计算
	bool loadDataFromFile(char* data);					  // 从文件中读入数据,放入字符数组data中
	void setFrameFront(FrameFront& frameFront, const char* data); // 设定前导码、帧前定位符、目的地址、源地址、数据长度等
	bool storeFrameInFile(const FrameFront& frameFront, const char* data, const unsigned char crc);  // 将Ethernet帧
																									 // 保存到文件中
	void outputFrameFront(const FrameFront& frameFront);  // 将前导码、帧前定位符、目的地址、源地址、数据长度等输出

private:
	char* filePath;		// 在帧解析时,指定待解析的文件的路径;
						// 在帧封装时,指定封装后的数据所存放的文件路径;该值在构造函数中被初始化
	bool isPackaging;   // 该值表示操作的类型,为true表示进行帧封装操作,为false表示进行帧解析操作;
						// 该值在构造函数中被初始化
	
	// 内部辅助数据
	enum {MIN_DATA_LENGTH = 46};	// 数据段的最小长度,单位:字节
	enum {MAX_DATA_LENGTH = 1500};  // 数据段的最大长度,单位:字节
	char hexAlpha[16];				// 在构造函数中为该数组赋值为:
									// {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
									// 用来将一个4bits的二进制值转换成对应的十六进制字符	
	enum {WIDTH = 10};				// 定义标题列的宽度为10个字符,
									// 所谓标题列是指“序号:”、“目的地址”、“CRC校验”等字符串
};

#endif  // FRAMEHANDLER_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -