1、计算机网络设计课题一: 计算校验和1.设计目的:本课程设计主要通过一个简单例子使学生了解网络协议中校验和的计算过程,以及设置校验和的作用。 目前,进行差错检测和差错控制的主要方法是:在需要传输的数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送数据应用某种算法进行计算而得到的。数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就说明出现了差错,此时可以要求发送方重传该数组数据,以此达到数据准确性的目的。计算校验和的算法称为国际校验和算法,简单来说,就是把被校验的数据按16位进行累加,然后取反码。若数据字节长度为奇数,则在这数据尾部补一个字节的0以凑
2、成偶数。2. 课程设计要求根据前面介绍的算法,编制程序为给定数据计算校验和。1) 以命令形式运行:check_sum infile其中check_sum为程序名,infile为输入数据文件名。2) 输出:数据文件的校验和。3.程序源代码#include#includevoid main(int argc,char *argv) FILE *fp; char ch; unsigned char chrl,chrh; unsigned int count=0,checksum=0,chr=0; unsigned long int sum=0; if(fp=fopen(D:yd.txt,r)=NUL
3、L) printf(nn File cant be opened?); exit(1); printf(nnthe type of output:data-sumnn); while(1) if(ch=fgetc(fp)!=EOF) count+; if(ch!= ) if(count%12=0) printf(n); if(ch=0&ch=a&ch=A&ch=F) ch=ch-A+10; if(count%2=1) chrh=ch4; else chrl=ch&0x0f; chr=chrh|chrl; if(count%4=2) sum+=chr16) checksum=-(long)(su
4、m16+(long)(sum&0x0000ffff); checksum=checksum&0x0000ffff; printf(nnsum:%1x-checksum:%x,sum,checksum); printf(nnsource:argc=%d,targv=%sn,argc,argv1); fclose(fp);【程序运行】文档内容:运行结果:设计课题二: IP地址的合法性及子网判断1.设计目的:编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定子网。其中判断归属问题方法为将二进制IP地址与子网掩码按位进行“与”运算。若“与”运算所得值与给定子网地址一致,则说明该IP地址属
5、于给定的子网。2.设计要求在掌握IP地址表示方法及子网划分方法的基础上,按如下要求完成程序。1)命令行格式:ip_test subnet/mask ip_addr其中,ip_test为程序名;subnet为子网号;mask是一个数值,代表子网掩码连续1的个数;ip_addr是要测试的IP地址。2)判断subnet和ip_addr的合法性。3)判断掩码的合法性。4)在IP地址合法的前提下,判断ip_addr是否属于子网subnet.5) 输出命令行中的ip是否合法,掩码是否合法(可适当给出不合法原因)以及ip_addr是否属于子网subnet。3.程序源代码:#include #include
6、#include #include #include #include /类结构class ipTestchar ip15; char subnetPlusMask18; char subnet18; char TempIp15; char TempSub18; int mask; bool maskIsValid;public: ipTest(char *,char *); ipTest(); bool NoIllegalChar(char *); /非法字符的判断 bool ipIsValid(char *); /判断IP地址是否合法 bool subnetIsValid(char *);
7、 /判断子网号是否合法 void belong(); /判断IP是否为子网成员 print();/主函数void main(int argc,char *argv ) if(argc != 3) /判断参数格式是否正确 couterrorendlformat shoud be:ip_test subnet/mask ip18) /先判断最简单的错误,长度是否超出 cout15) coutip is too long; return; ipTest test(argv1,argv2); /实例化ipTest类 test.print(); /完成相应判别并输出结果 /构造函数ipTest:ipTe
8、st(char* subnetPlusMask,char *ip) maskIsValid=true; char temp2;/把/前的字符复制到subnet字符数组中 int smLen=strlen(subnetPlusMask); for(int i=0;isubneti=subnetPlusMaski; this-TempSubi=subnetPlusMaski; subneti=0; TempSubi=0; if(i=smLen-2) /初始化mask和maskIsValid if(i=smLen-2) temp0=subnetPlusMaski+1; if(!isdigit(tem
9、p0) maskIsValid=false; else if(i=smLen-3) temp0=subnetPlusMaski+1; temp1=subnetPlusMaski+2; if(!(isdigit(temp0)&isdigit(temp1) maskIsValid=false; mask=atoi(temp); if(mask32) maskIsValid=false; else /用十进制表示的掩码中的1的个数只能是一位数或两位数 maskIsValid=false; strcpy(this-subnetPlusMask,subnetPlusMask); /给subnetPlus
10、Mask赋值 strcpy(this-ip,ip); /给IP赋值 strcpy(this-TempIp,ip);/调用判别函数,并输出结果ipTest:print() bool subIsV=subnetIsValid(TempSub); bool ipIsV=ipIsValid(TempIp); if(!subIsV) /subnet非法 coutsubnet is invalid ! endl; else coutvalid subnet: subnetendl; if(!maskIsValid) /mask非法 coutmask is invalid ! endl; else cout
11、valid mask: maskendl; if(!ipIsV) /ip非法 coutip is invalid ! endl; else coutvalid ip: ipendl; /判断ip是否belong subnet if(subIsV & ipIsV & maskIsValid) belong();/子函数,判断输入是否含有非数字字符bool ipTest:NoIllegalChar(char *ch) unsigned int i,k=0; for(i=0;istrlen(ch)-1;i+); if(isdigit(*(ch+i)=0) /判断每一位是否为数字字符 return f
12、alse; return true; /若不含有非数字字符则返回true/判断IP地址是否合法bool ipTest:ipIsValid(char *ip) char ch= .; /分隔符 char *token,*dot4; int iplen=0; token=strtok(ip,ch); /以.标志将IP字符串按字节分开 while(token!=NULL) /循环进行,直到结束 dotiplen=token; /将分开的每段赋值给dot iplen+; token=strtok(NULL,ch); if(iplen!=4) return false; /段数不对 for(int i=
13、0;i255) /有非法字符或某段值非法 return false; return true;/判断子网号是否合法bool ipTest:subnetIsValid(char* subnet) if(!ipIsValid(subnet) /调用判别IP地址合法性的函数 return false; return true;/判断IP是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题void ipTest:belong() int subLen=strlen(subnet); int ipLen=strlen(ip); unsigned int iIPA,iSubA,iMas
14、k; unsigned char subA4,ipA4; char temp3; int i,j,t=0; for(i=0,j=0;isubLen;i+) /不用再检错 if(subneti!=.) tempj+=subneti; /temp数组中放.间的串 else subA3-t=atoi(temp); /subA数组中放.间的数据 j=0; t+; temp0=temp1=temp2=0; subA0=atoi(temp); temp0=temp1=temp2=0; iSubA=*(unsigned int *)subA; /iSubA中放subnet中.除外的串对应的数 for(i=0
15、,j=0,t=0;iipLen;i+) /不用再检错 if(ipi!=.) tempj+=ipi; else ipA3-t=atoi(temp); j=0; t+; temp0=temp1=temp2=0; ipA0=atoi(temp); iIPA=*(unsigned int *)ipA; /iIPA中放IP中.除外的串对应的数 iMask=0xffffffff; iMask=(32-mask); /获得掩码 if(iSubA | iMask)!=iMask) /说明sub与mask不匹配 cout 子网号与掩码不匹配,error!endl; return; if(iSubA iMask)
16、=0) /说明子网号全1 cout 子网号全1,error!endl; return; if(iSubA & iMask)=0) /说明子网号全0 cout 子网号全0,error!endl; return; if(iSubA) = (iIPA & iMask) /IP和掩码与,结果和子网号进行比较 if(iIPA | iMask)=iMask) /说明主机号全0 cout 主机号全0,error!endl; return; if(iIPA | iMask)=0xffffffff) /说明主机号全1 cout 主机号全1,error!endl; return; /ip属于subnet cout
17、 ipbelongs tosubnetPlusMaskendl; return;/ip不属于subnetelse cout ipdoesnt belong tosubnetPlusMaskendl; 【程序运行】设计心得:本次计算机网络课程设计维持了一周的时间,通过这次的课程设计,使我对网络协议中校验和的设置与计算以及IP地址的合法性及子网判断有了很好的理解与掌握,拓宽了我网络方面的知识,同时也加强了我程序设计的能力,不得不说这次的课程设计让我收获很大。此次课程设计主要是完成校验和的计算以及判断IP合法性,由于之前对这方面的知识了解不是很多,所以在课设刚开始的我们都不知道从何入手,随后我结合老师发给我们的资料对内容做了进一步的了解,才对校验和IP合法性以及子网方面的知识有了一定的掌握,并且知道了设置校验和的作用以及各类IP的分类子网划分等等。一周的课程设计使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助过我的同学。同时,让我知道课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。通过这次课程设计使我明白了自己原来知识还比较欠缺。在日后为期不多的大学学习中,理论联系实际,不断提高自己的学习能力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1