计算机网络.docx
《计算机网络.docx》由会员分享,可在线阅读,更多相关《计算机网络.docx(12页珍藏版)》请在冰豆网上搜索。
![计算机网络.docx](https://file1.bdocx.com/fileroot1/2023-1/3/b1c4c9bc-7509-48bd-89c7-7876524d099e/b1c4c9bc-7509-48bd-89c7-7876524d099e1.gif)
计算机网络
设计课题一:
计算校验和
1.设计目的:
本课程设计主要通过一个简单例子使学生了解网络协议中校验和的计算过程,以及设置校验和的作用。
目前,进行差错检测和差错控制的主要方法是:
在需要传输的数据分组后面加上一定的冗余信息,这样的冗余信息通常都是通过对所发送数据应用某种算法进行计算而得到的。
数据的接收方在接收到数据后进行同样的计算再与收到的冗余信息进行比较,如果结果不同就说明出现了差错,此时可以要求发送方重传该数组数据,以此达到数据准确性的目的。
计算校验和的算法称为国际校验和算法,简单来说,就是把被校验的数据按16位进行累加,然后取反码。
若数据字节长度为奇数,则在这数据尾部补一个字节的0以凑成偶数。
2.课程设计要求
根据前面介绍的算法,编制程序为给定数据计算校验和。
1)以命令形式运行:
check_suminfile
其中check_sum为程序名,infile为输入数据文件名。
2)输出:
数据文件的校验和。
3.程序源代码
#include
#include
voidmain(intargc,char*argv[])
{
FILE*fp;
charch;
unsignedcharchrl,chrh;
unsignedintcount=0,checksum=0,chr=0;
unsignedlongintsum=0;
if((fp=fopen("D:
\\yd.txt","r"))==NULL)
{
printf("\n\nFilecan'tbeopened?
?
");
exit
(1);
}
printf("\n\nthetypeofoutput:
data---sum\n\n");
while
(1)
{
if((ch=fgetc(fp))!
=EOF)
{
count++;
if(ch!
='')
{
if(count%12==0)
{
printf("\n");
if(ch>='0'&&ch<='9')
{
ch-='0';
}
else
{
if(ch>='a'&&ch<='f')
{
ch=ch-'a'+10;
}
else
{
if(ch>='A'&&ch<='F')
{
ch=ch-'A'+10;
}
}
}
}
if(count%2==1)
{
chrh=ch<<4;
}
else
{
chrl=ch&0x0f;
chr=chrh|chrl;
if(count%4==2)
{
sum+=chr<<8;
}
else
{
if(count%4==0)
{
sum+=chr;
}
printf("%x--%1x",chr,sum);
}
}
}else
{
count--;
}
}
else
{
break;
}
}
if(sum>>16)
checksum=-(long)(sum>>16+(long)(sum&0x0000ffff));
checksum=checksum&0x0000ffff;
printf("\n\nsum:
%1x---checksum:
%x",sum,checksum);
printf("\n\nsource:
argc=%d,\targv=%s\n",argc,argv[1]);
fclose(fp);
}
【程序运行】
文档内容:
运行结果:
设计课题二:
IP地址的合法性及子网判断
1.设计目的:
编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定子网。
其中判断归属问题方法为将二进制IP地址与子网掩码按位进行“与”运算。
若“与”运算所得值与给定子网地址一致,则说明该IP地址属于给定的子网。
2.设计要求
在掌握IP地址表示方法及子网划分方法的基础上,按如下要求完成程序。
1)命令行格式:
ip_testsubnet/maskip_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
#include
#include
#include
#include
//类结构
classipTest{
charip[15];
charsubnetPlusMask[18];
charsubnet[18];
charTempIp[15];
charTempSub[18];
intmask;
boolmaskIsValid;
public:
ipTest(char*,char*);
ipTest(){};
boolNoIllegalChar(char*);//非法字符的判断
boolipIsValid(char*);//判断IP地址是否合法
boolsubnetIsValid(char*);//判断子网号是否合法
voidbelong();//判断IP是否为子网成员
print();
}
;
//主函数
voidmain(intargc,char*argv[]){
if(argc!
=3){//判断参数格式是否正确
cout<<"error"<ip_testsubnet/maskip"<return;
}
else{
if(strlen(argv[1])>18){//先判断最简单的错误,长度是否超出
cout<<"subnet/maskistoolong";
return;
}
if(strlen(argv[2])>15){
cout<<"ipistoolong";
return;
}
ipTesttest(argv[1],argv[2]);//实例化ipTest类
test.print();//完成相应判别并输出结果
}
}
//构造函数
ipTest:
:
ipTest(char*subnetPlusMask,char*ip){
maskIsValid=true;
chartemp[2];
//把'/'前的字符复制到subnet字符数组中
intsmLen=strlen(subnetPlusMask);
for(inti=0;i='/';i++){
this->subnet[i]=subnetPlusMask[i];
this->TempSub[i]=subnetPlusMask[i];
}
subnet[i]='\0';
TempSub[i]='\0';
if(i<=smLen-2){//初始化mask和maskIsValid
if(i==smLen-2){
temp[0]=subnetPlusMask[i+1];
if(!
isdigit(temp[0]))
maskIsValid=false;
}
elseif(i==smLen-3){
temp[0]=subnetPlusMask[i+1];
temp[1]=subnetPlusMask[i+2];
if(!
(isdigit(temp[0])&&isdigit(temp[1])))
maskIsValid=false;
}
mask=atoi(temp);
if(mask<0||mask>32)
maskIsValid=false;
}
else//用十进制表示的掩码中的1的个数只能是一位数或两位数
maskIsValid=false;
strcpy(this->subnetPlusMask,subnetPlusMask);//给subnetPlusMask赋值
strcpy(this->ip,ip);//给IP赋值
strcpy(this->TempIp,ip);
}
//调用判别函数,并输出结果
ipTest:
:
print(){
boolsubIsV=subnetIsValid(TempSub);
boolipIsV=ipIsValid(TempIp);
if(!
subIsV)//subnet非法
cout<<"subnetisinvalid!
"<else
cout<<"validsubnet:
"<if(!
maskIsValid)//mask非法
cout<<"maskisinvalid!
"<else
cout<<"validmask:
"<if(!
ipIsV)//ip非法
cout<<"ipisinvalid!
"<else
cout<<"validip:
"<//判断ip是否belongsubnet
if(subIsV&&ipIsV&&maskIsValid)
belong();
}
//子函数,判断输入是否含有非数字字符
boolipTest:
:
NoIllegalChar(char*ch){
unsignedinti,k=0;
for(i=0;iif(isdigit(*(ch+i))==0){//判断每一位是否为数字字符
returnfalse;
}
}
returntrue;//若不含有非数字字符则返回true
}
//判断IP地址是否合法
boolipTest:
:
ipIsValid(char*ip){
charch[]=".";//分隔符
char*token,*dot[4];
intiplen=0;
token=strtok(ip,ch);//以"."标志将IP字符串按字节分开
while(token!
=NULL){//循环进行,直到结束
dot[iplen]=token;//将分开的每段赋值给dot
iplen++;
token=strtok(NULL,ch);
}
if(iplen!
=4)
returnfalse;//段数不对
for(inti=0;i<4;i++){
if(!
NoIllegalChar(dot[i])||atoi(dot[i])>255)//有非法字符或某段值非法
returnfalse;
}
returntrue;
}
//判断子网号是否合法
boolipTest:
:
subnetIsValid(char*subnet){
if(!
ipIsValid(subnet))//调用判别IP地址合法性的函数
returnfalse;
returntrue;
}
//判断IP是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题
voidipTest:
:
belong(){
intsubLen=strlen(subnet);
intipLen=strlen(ip);
unsignedintiIPA,iSubA,iMask;
unsignedcharsubA[4],ipA[4];
chartemp[3];
inti,j,t=0;
for(i=0,j=0;iif(subnet[i]!
='.')
temp[j++]=subnet[i];//temp数组中放'.'间的串
else{
subA[3-t]=atoi(temp);//subA数组中放'.'间的数据
j=0;
t++;
temp[0]=temp[1]=temp[2]='\0';
}
}
subA[0]=atoi(temp);
temp[0]=temp[1]=temp[2]='\0';
iSubA=*(unsignedint*)subA;//iSubA中放subnet中'.'除外的串对应的数
for(i=0,j=0,t=0;iif(ip[i]!
='.')
temp[j++]=ip[i];
else{
ipA[3-t]=atoi(temp);
j=0;
t++;
temp[0]=temp[1]=temp[2]='\0';
}
}
ipA[0]=atoi(temp);
iIPA=*(unsignedint*)ipA;//iIPA中放IP中'.'除外的串对应的数
iMask=0xffffffff;
iMask<<=(32-mask);//获得掩码
if((iSubA|iMask)!
=iMask){//说明sub与mask不匹配
cout<<"子网号与掩码不匹配,error!
"<return;
}
if((iSubA^iMask)==0){//说明子网号全1
cout<<"子网号全1,error!
"<return;
}
if((iSubA&iMask)==0){//说明子网号全0
cout<<"子网号全0,error!
"<return;
}
if((iSubA)==(iIPA&iMask)){//IP和掩码与,结果和子网号进行比较
if((iIPA|iMask)==iMask){//说明主机号全0
cout<<"主机号全0,error!
"<return;
}
if((iIPA|iMask)==0xffffffff){//说明主机号全1
cout<<"主机号全1,error!
"<return;
}
//ip属于subnet
cout<<""<return;
}
//ip不属于subnet
else
cout<<""<}
【程序运行】
设计心得:
本次计算机网络课程设计维持了一周的时间,通过这次的课程设计,使我对网络协议中校验和的设置与计算以及IP地址的合法性及子网判断有了很好的理解与掌握,拓宽了我网络方面的知识,同时也加强了我程序设计的能力,不得不说这次的课程设计让我收获很大。
此次课程设计主要是完成校验和的计算以及判断IP合法性,由于之前对这方面的知识了解不是很多,所以在课设刚开始的我们都不知道从何入手,随后我结合老师发给我们的资料对内容做了进一步的了解,才对校验和IP合法性以及子网方面的知识有了一定的掌握,并且知道了设置校验和的作用以及各类IP的分类子网划分等等。
一周的课程设计使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助过我的同学。
同时,让我知道课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
通过这次课程设计使我明白了自己原来知识还比较欠缺。
在日后为期不多的大学学习中,理论联系实际,不断提高自己的学习能力。