整体协议实现的都主要在模拟帧发送接收上,并没有实现真正意义上的传输,如果对你有帮助 麻烦github帮忙点个⭐吧~ 完成了 首先用户建立连接,发出 进入 在这些初始化工作完成后,便调用 紧接着,在远程地址收到组帧后,调用 在解析函数中,首先调用 检查过程大概如下: 在拆帧以后,首先输出对应的组帧、帧长以及其中的地址字段、控制字段、数据字段、 至此,帧解析完成,返回所解析帧的类型给 由上文,在地址接受完信息以后,由用户对比数据,选择数据是否发送成功。若校验数据成功,则发送 通过调用 由于在代码完成时使用的是 其次,并没有实现老师所说的开两个线程来进行连接建立、数据传输、连接拆除的操作,而是在一个线程中进行了这些过程的模拟。 在组帧阶段中,为了简化问题,默认地址字段为8比特,没有考虑地址首位为0的地址扩充情况;默认控制字段为8比特,并默认控制字段的 在连接过程中,对于广播模式和测试链路状态模式中,没有进行具体的函数实现,仅仅输出了相关的提示信息,而仅仅对有效地址进行了连接的建立、数据的传输、连接的拆除等操作。 在传输过程中。 对于无编号帧 但我只考虑了 对于监控帧 但我只考虑了
计算机通信基础课程设计实验报告
源码:https://github.com/baijq643048734/HDLC
目录
文章目录
实验内容
HDLC
协议最基本的协议内容,包括:
CRC
冗余校验来验证正确性实验步骤
一、连接的建立与拆除
1. 相关函数
//链接建立与拆除相关函数 int build_SNRM_frame(char *Address); //建立要发起连接的SARM连接帧 int build_UA_frame(char *Address); //建立确认UA连接帧 int build_DISC_frame(char *Address); //建立请求断连的DISC帧 int connect_to_addr(char * Address); //与目的地址主机连接 //void receive(char *frame); //接收帧
2. 主要实现功能
Address
数组,然后通过调用函数connect_to_addr
,来判断用户输入地址是否合法,并且判断地址为有效地址、广播地址(11111111)还是链路测试专用地址(00000000)。若用户输入广播地址或链路测试地址,则输出相关信息;若用户输入有效地址,则调用build_SNRM_frame
函数建立SNRM
帧,并发送SNRM
帧并等待接收UA
帧与远程地址建立连接。远程地址通过build_UA_frame
函数建立UA
帧并发送。
(注:具体组帧操作见下文)
build_DISC_frame
函数发送DISC
帧请求断连并等待远程地址发送UA帧确认断连。3. 连接、拆除流程图
二、组帧、拆帧、帧解析操作
1. 相关函数
// frame.h此处函数均为组帧操作内部调用函数 int _2_x(int x); //2的x次方 void char_to_bit(char letter, char *bit); //将单独字母转化为比特串 int info_to_bit(char *Info, int Info_len, char *Info_temp); //将传输数据转化为比特串 void print_info_bit(char *Info,int Info_len); //打印数据比特串 void flag_fld_header(char *frame); //初始化组帧帧头 void addr_fld(char *frame, char *Address); //初始化组帧地址字段 void control_fld(char *frame, char *Control); //初始化组帧控制字段 //int bit_stf(char *Info, int Info_len); //数据字段字节扩充 int info_fld(char *frame, char *Info, int Info_len); //初始化组帧数据字段 int fcs_fld(char *frame,char *FCS,int frame_length); //初始化组帧FCS字段 int bit_stf(char *frame, int frame_length); //0bit扩充 int flag_fld_end(char *frame, int frame_length); //初始化组帧帧尾 void print_frame(char *frame, int frame_length); //打印组帧 int Frameing(char *Address, char *Control, char *Info, int Info_len, char *FCS, char *frame); //组帧操作 返回帧长 // initfield.h 初始化字段 int init_control_fld(char *Control,int control_type); //控制字段生成 返回控制字段帧类型编号 int init_info_fld(char *Info, int info_type,char *Info_temp); //根据控制字段帧类型编号 填充数据字段 返回数据字段长度 void init_fcs_fld(char *Info, char *FCS,int info_type); //根据数据生成CRC校验码 void bin_div(char *inStr,char *outStr); //bit除法 void checkCRC(char *inStr, char *outStr); //CRC校验码生成 // 数据发送相关函数 int send(int flag); //发送帧 返回发送的帧类型 int frame_parsing(char *frame, int frame_len, int info_len); //帧解析函数 调用unframe函数 然后对帧进行解析 void unframe(char *frame, int frame_len, int info_len, char *addr, char *cont, char *info, char *fcs); //拆帧 int bit_del(char *frame, int len, char *frame1); //0bit删除 //*帧解析相关函数 int control_parsing(char *recv_cont); //解析控制字段 返回帧类型 void info_parsing(int fcs_flag, int con_type, char *recv_info, int info_len); //解析数据字段 int fcs_parsing(int con_type, char *recv_info, char *recv_fcs); //进行CRC校验 成功返回1 否则返回0 void bit_to_info(char *recv_info, int info_len); //bit串转字符串
2. 主要实现功能
在组帧过程中,最主要的函数是`Frameing` 。
SNRM
帧以后,进入一个循环,不断调用send
函数。send
函数后,若用户需要发送数据,则会调用init_control_fld
函数并传入生成信息帧的标志I
,来生成相应的控制帧,在函数中,会通过全局变量Info_num
来告知这是已发送的第几个数据段,并写给控制字段的N(S)、N(R)
。在控制字段初始化完成后,紧接着便调用init_info_fld
函数来初始化数据字段,将用户输入的数据转化为比特串赋值给全局变量Info
,并返回数据字段比特长度,然后调用init_fcs_fld
函数对用户输入数据生成相应的CRC
冗余校验码。Frameing
函数对之前的全局变量进行0比特填充(bit_stf
)、拼接、加入帧头帧尾,形成一个完整的组帧。至此,组帧操作全部完成。frame_parsing
函数,对帧进行解析。unframe
函数,将一个组帧进行拆除帧头帧尾、0比特删除(bit_del
)等相关操作,将组帧分成地址、控制、数据、FCS
字段并赋值给局部变量进行相关信息的分析检查。FCS
字段。然后调用control_parsing
进行控制字段分析。之所以要先分析控制字段,因为控制字段中包含帧的类型,先判断出帧的类型,才可以对帧中的信息进行相应的解读。函数分析完控制字段后,返回该帧的帧类型,并传入紧接着要调用的fcs_parsing
函数,若帧类型为数据帧(I
),则在函数中会进行相应的CRC
冗余校验,来验证信息是否正确,并将验证正确与否的结果返回,传入紧接着的数据字段分析函数info_parsing
,若CRC
校验成功,则函数先输出数据比特串,然后调用函数bit_to_info
将数据比特串转换回字符串结构并显示给用户。
main
函数,在主函数中,通过判断返回的帧的类型进行相应的操作——若返回类型为数据帧(I
),则继续进行实用停等协议的流程;而返回类型若是断连无编号帧(DISC
),则发送UA
帧来结束本次连接。三、实用停等协议的实现与模拟
1.相关函数
//停等协议流程相关函数 void num_to_str(int info_num, char *info_num_str); //将序号转为二进制存放 int build_RR_frame(char *Address); //建立RR确认帧 int build_SREJ_frame(char *Address); //建立SREJ请求重发帧
2.主要实现功能
RR
帧,告知主机已收到该信息帧,并改变全局变量Info_num
的值,也就是改变了N(S)、N(R)
;若校验数据失败,则发送SREJ
帧告知主机,重新发送编号为Info_num
的帧,即完成了一个简易的使用停等协议的模拟。
四、CRC冗余校验
1. 相关函数
void init_fcs_fld(char *Info, char *FCS,int info_type); //根据数据生成CRC校验码 void bin_div(char *inStr,char *outStr); //bit除法 void checkCRC(char *inStr, char *outStr); //CRC校验码生成
2. 主要实现功能
checkCRC
函数,传入数据字段,生成相应的冗余码。在校验时,通过对比组帧的FCS
字段和收到数据生成的CRC
冗余码是否一致来判断数据是否有变动。实验缺陷
一、整体情况
Dev-C++
编译器,最开始多文件连编时,总是出现类似于找不到头文件等稀奇古怪的错误,于是最后我只好把各个文件中的代码全部放入main.cpp
函数中,整体代码量也较大,可能会使老师读源码比较费劲。二、组帧、拆帧、帧解析阶段
P/F bit
位始终为1;默认FCS
字段为16比特,也就是默认冗余码的生成规则为CRC-16
。三、连接建立、拆除过程
四、传输过程
U
:完整的HDLC
协议有以下多种无编号帧。SNRM
、UA
、DISC
三种无编号帧来实现基本的连接建立、拆除、确认操作。S
:完整的HDLC
协议有以下多种无编号帧。RR
、SREJ
两种监控帧来实现基本的实用停等协议的过程。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算