中国地质大学《计算机网络》课程设计报告
5.2.2 CRC计算流程图
6
中国地质大学《计算机网络》课程设计报告
6.程序源代码
#include
void main(int argc,char*argv[]) {
//如果输入命令行不正确,则输出提示后退出。 if(argc!=3) {
cout< //打开指定的输出文件,以二进制方式打开并可读可写,如文件存在,则清除其内容。 fstream file(argv[2],ios::out|ios::in|ios::binary|ios::trunc,0); for(int i=0;i<7;i++) file.put((char)0xaa); file.put((char)0xab);//写入B的前导码和B的帧前定界符。 char des_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC)}; file.write(des_add,6);//写入B的目的地址。 char sor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65)}; file.write(sor_add,6);//写入B的源地址。 //创建输入文件流并打开指定的输入文件,以二进制方式打开并可读。 ifstream infile(argv[1],ios::in|ios::binary,0); int length=0; infile.seekg(0,ios::end);//将读指针移到文件末尾。 length=infile.tellg();//计算指针偏移量,即为输入文件的长度。 unsigned char* data=new unsigned char[length];//创建字符指针并根据文件长度初始化。 infile.seekg(0,ios::beg);//将读指针移到文件开始。 7 中国地质大学《计算机网络》课程设计报告 infile.read(data,length);//将文件数据读入到字符指针data中。 file.put(char(length>>8)); file.put(char(length&0xff));//将文件长度值按照逆序写入到输出文件的长度字段中。 file.write(data,length);//将data内容写入到输出文件中。 //如果输入文件长度不足B,则用补足B。 if(length<46) { for(int j=length;j<46;j++) file.put(char(0x00)); } file.put(char(0x00));//将数据字段后添加个 file.seekg(8,ios::beg);//将读指针指向目的地址字段,从此处开始CRC计算 unsigned char ch;//ch用来保存读入的字符。 unsigned char crc=char(0x00);//余数初始值为。 while(1)//进行CRC计算 { file.get(ch); if(ch==0xff)//判断是否到了文件结尾,如果是,则退出循环。 break; for(i=0;i<8;i++)//对入读入的字符的位分别处理。 { if(0x80==(crc&(0x80)))//当前余数最高位为,需要进行除法运算。 { crc=(crc<<1)&(0xff);//crc左移位,最低位补。 crc=crc|((ch&0x80)>>7);//将输入数据相应的值递补到余数末位。 crc=crc^(0x07);//进行除法运算,即与除数的低位相异或。 } else//当前余数的最高位为,不需要进行除法运算。 { crc=(crc<<1)&(0xff);//crc左移位,最低位补。 crc=crc|((ch&0x80)>>7);//将输入数据相应位的值递补到余数末位。 } ch=ch<<1;//读到的字符左移位,使数据下一位作为输入位。 } } file.clear(); file.seekp(-1,ios::end);//将写指针移到输出文件的最后。 8 中国地质大学《计算机网络》课程设计报告 file.put(crc);//写入crc码。 file.close(); infile.close();//关闭输入文件和输出文件。 cout< 7.运行结果 运行结果如下所示: 执行framer.exe文件的结果如下所示: 9 中国地质大学《计算机网络》课程设计报告 8.调试过程 最开始编程的时候,没有完全掌握好帧的七个组成部分,在进行封装的时候因为缺少了其中的长度字段,因而在执行framer.exe文件时,不能得到正确而的结果。在这方面,最后通过细心的检查和查阅相关的资料,知道所缺的部分。将其添加后,程序的整个部分无误。 又由于在此次的程序中,有很多函数的运用,因为对函数的运用掌握的不是很全面,在编写程序的过程中多多少少都会遇到一定程度的麻烦。如fstream 既可以输入也可以输出,而ifstream只能进行输入。刚开始编写的时候,将两者沦为一团,结果不能正确显示;seekg函数的运用中也遇到类似的问题。 9.总结与体会 在此次的课程设计中,我做的题目是帧封装。在最开始两天收集资料的过程中,我查阅了很多帧的封装的知识,对帧及其封装的方法有了一定程度的了解和掌握。从最开始对帧的一个模糊的印象到对帧的结构的七个部分的完全掌握,有了很大的收获,并且使帧的封装得以实现。 本次的课程设计为了实现帧的封装,主要是将帧的七个部分---前导码、帧前定界符、目的地址、源地址、长度字段、数据字段和校验字段,一个一个按顺序封装的,最后使得一个帧的封装得以完成。同时,在编写程序的过程中,用到了很多的函数,这些函数的运用使得程序简便而且正确的运行出来。为了正确的实现这些函数,我查阅了很多相关的资料,从中获得了大量的有用的信息,收获也颇丰富。 同时,在这近一周的课程设计中,我的动手能力得到了很大的提高,而且让你给我将这学期所学的网络的知识和以前所学的编程的知识充分的联系起来,对这门课的认识又提高了一层。除此之外,在做课程设计的时候也遇到了很多的问题,最后在同学的帮助下正确的解决了。从最开始的遇到问题到最后的正确解决问题,我懂得了正确出来问题的方法,也知道了自己的不足之处。此次的课程设计也是一个认识自我的好机会。 10 中国地质大学《计算机网络》课程设计报告 10.参考资料 参考教材: 吴功宜 吴英.计算机网络教程(第3版)[M].北京:电子工业出版社,2003.4. 参考文献: ⑴ 谢希仁.计算机网络[M].北京:电子工业出版社, ⑵ 孙学军.计算机网络[M].北京:电子工业出版社, ⑶ 王能.计算机网络原理[M].北京:电子工业出版社, ⑷ 杨丰瑞 杨丰任.实用教程最新计算机网络[M].北京:中国铁道出版社, ⑸ AndrewS. Tanenbaum(安得鲁·坦尼伯姆)著,熊桂喜 王小虎译 李学农审.计算机网(第3版)[M].北京:清华大学出版社 ⑹现代网络技术教程 张公忠 电子工业出版社 ⑺计算机网络教程 吴功宜等 电子工业出版社 ⑻计算机网络 吴企渊等 清华大学出版社 11