网络管理课程设计BER编解码报文构造与解析Word格式文档下载.docx
- 文档编号:16331298
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:15
- 大小:103.21KB
网络管理课程设计BER编解码报文构造与解析Word格式文档下载.docx
《网络管理课程设计BER编解码报文构造与解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《网络管理课程设计BER编解码报文构造与解析Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
voidInteger_TLV(unsignedchar*TLV,int&
len,intvalue)
{unsignedchar*tlv;
tlv=TLV;
tlv[0]=INTEGER;
//TLV_Tstacks;
if(value>
=0)
{if(value<
=127)
{tlv[1]=1;
//TLV_L
tlv[2]=value;
//TLV__V
len=3;
}
else//>
128
{convert(s,value,2);
intlength=((s.top-s.base)%8);
if(length==0)//
{intnum_8=(s.top-s.base)/8;
tlv[1]=num_8+1;
len=2+num_8+1;
tlv[2]=0;
//value
for(intk=num_8;
k>
=1;
--k)
{intsum_8=0;
intlocal=k*8-1;
intlastlocal=0;
for(intj=0;
j<
8;
j++)
{intee=0;
Pop(s,ee);
sum_8+=pow(ee*2,local--);
lastlocal=ee;
}if(lastlocal==0)
{tlv[num_8+3-k]=sum_8-1;
}else{
tlv[num_8+3-k]=sum_8;
}}}else
{
intsum=0;
intLENGTH=(s.top-s.base)/8;
//tlv.V=newunsignedchar[LENGTH+1];
intfirstlastlocal=0;
for(inti=0;
i<
length;
i++)
{
inte=0;
Pop(s,e);
sum+=pow(e*2,length-1-i);
firstlastlocal=e;
//tlv.V+=pow(Pop(s,e),length-1-i);
}tlv[1]=1+LENGTH;
len=2+1+LENGTH;
if(firstlastlocal==0)
{tlv[2]=sum-1;
}else
{tlv[2]=sum;
//value}intnum_8_bit=(s.top-s.base)/8;
for(intk1=num_8_bit;
k1>
--k1)
{
intsum_8_bit=0;
intlocal_8=k1*8-1;
intlastlocal=0;
{intee_bit=0;
Pop(s,ee_bit);
sum_8_bit+=pow(ee_bit*2,local_8--);
lastlocal=ee_bit;
}if(lastlocal==0)
{tlv[num_8_bit+3-k1]=sum_8_bit-1;
}else
{tlv[num_8_bit+3-k1]=sum_8_bit;
}}}}}else
{}}
字符型:
比较简单,直接编成asc码就行了。
标识符:
voidObjectidentifier_TLV(unsignedchar*TLV,int&
len,stringvalue)
{stringstrdod="
."
;
stringsmallstr;
//boolstrover=false;
//charstrl[50];
intj=0;
for(inti=4;
value.length();
i++)//(int)value.length1.3.6.2.1
{stringstr=value.substr(i,1);
//value.c_str()
if(!
strcmp(str.c_str(),strdod.c_str()))//
{//strover=true;
continue;
}//compare(value.substr(i,1)
else{//if(strover)
smallstr+=str;
}}unsignedchar*tlv;
tlv[0]=OBER;
//1.3.6.1.0TLV_T
tlv[1]=1+smallstr.length();
//TLV_l
len=2+1+smallstr.length();
tlv[2]=43;
//+smallstr;
TLV_V
for(intl=0;
l<
smallstr.length();
l++)
{tlv[l+3]=atoi(smallstr.substr(l,1).c_str());
//
}}
Ip地址:
与标识符类似,只要把各部分分离出来编码即可。
举个编码的例子如下:
Snmpversion=1
Comminutiy=public
Command=getrequest
RequestID=8
Errorstatus=0(noerror)
Errorindex=0
Object={1.3.6.1.2.1.1.1.0}(sysDesor.0)
Value=null
编成:
4840210461121179810810599160272182102104814481068436121
11050
解码过程是编码过程的逆过程,相对而言,要简单一点。
因为在编码时,我们编成一个个字节形式,除了字符型用asc码编码,其他都表示成十进制数的形式
2.2报文构造和解析
整个报文的结构如下图,构造报文时,我们依据提示分别输入各个部分的数据,然后编码发送,报文构造即算完成。
报文的解析又是构造的逆过程,即分离出报文的各个部分,以便解码。
对应上面编码的例子,我们对其编码进行解析如下图:
注:
此处用十六进制,具体实现时,我们编成十进制,便于直接察看。
其中,围在方框内的是Tag字节,标有下划线的是长度字节,圆框里的是value部分编码。
2.3socket通信与输入输出
利用socket即套接字建立通信,发送编码好的报文给网关。
主要是以下的三个函数。
boolInitWinsock();
voidCennect();
voidWaitTrap();
至于输入输出,我们由于时间关系,没有能做出界面,虽然没有界面,对用户的操作带来不便,但是,我们每一步的操作都给了提示,操作还是很容易上手的。
4.设计结果
程序运行结果如下图:
我们实现了可以一次输入多个变量名,然后返回多个value的值。
并对其解析。
我们把构造的报文发向网关172.30.15.1,然后还可以自己自定义访问权限。
Public,private等。
抓包截图如下:
我们实现了,getRequest,getnextRequest,setRequest及manager收到的报文,trap报文很遗憾没有实现。
以下抓包抓的是set报文,为了方便起见,因为只是调试,我们把value字段的值定为25。
5.评价和总结
经过三天时间的紧张设计,熬了两个通宵,小组成员齐心协力,终于比较圆满的完成了课程设计的任务,实现了主要功能。
测试时,我们向网关发送报文,能收到其回应的报文并对其进行解析。
由于时间的原因,设计上还存在缺陷,没有完成其全部功能,有些遗憾,对于报文的解析,特别是对超过一个字节的整数编码的解析还存在一些小问题。
总的说来,完成情况良好,整个过程中,收获颇丰。
不仅重新学习了被遗忘的c语言,团队分工协作的能力,吃苦耐劳的精神都有提升。
6参考文献
《vc++——开发基于snmp的网络管理软件》武孟军徐袭任相臣编著人民邮电出版社2007年1月
《网络管理(第2版)》郭军编著北京邮电大学出版社2003年9月
附录:
主要程序代码
报文构造代码如下:
voidBindSequenceOf_TLV(unsignedchar*return_tlv_bind,int&
return_tlv_bind_len,messageMSG)//namevaluenamevalue
{for(inti=0;
6;
i++)//
{//getreturn_tlv_bind
unsignedcharreturn_tlv[50];
intreturn_tlv_len=0;
unsignedchartlv_name[10];
inttlv_name_len=0;
unsignedchartlv_value[10];
inttlv_value_len=0;
//for
if(MSG.pdu.variable_bindings[i].name.length()==0)continue;
else
{Objectidentifier_TLV(tlv_name,tlv_name_len,MSG.pdu.variable_bindings[i].name);
Sequence_TLV(return_tlv,return_tlv_len,tlv_name,tlv_name_len);
if(MSG.pdu.pdutype==2)//SET_REQUEST
{Null_TLV(tlv_value,tlv_value_len,25);
}else
{Null_TLV(tlv_value,tlv_value_len,-1);
}//((*(MSG.pdu.variable_bindings+i)).name);
Sequence_TLV(return_tlv,return_tlv_len,tlv_value,tlv_value_len);
SequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,return_tlv,return_tlv_len);
}}}
voidPduSequence_TLV(unsignedchar*return_tlv_Pdu,int&
return_tlv_Pdu_len,messageMSG)//pdutypeid00bind//,TLV&
return_tlv_bind
{switch(MSG.pdu.pdutype)
{case0:
return_tlv_Pdu[0]=160;
break;
//A0H"
10100000"
request
case1:
return_tlv_Pdu[0]=161;
//A1H"
10100001"
next_request
case2:
return_tlv_Pdu[0]=163;
//A3H"
10100011"
set_request
case3:
return_tlv_Pdu[0]=162;
//A2H"
10100010"
response
case4:
return_tlv_Pdu[0]=164;
//A4H"
10100100"
default:
break;
}
unsignedcharTLV_request_id[5];
intTLV_request_id_len=0;
unsignedcharTLV_error_status[5];
intTLV_error_status_len=0;
unsignedcharTLV_error_index[5];
intTLV_error_index_len=0;
Integer_TLV(TLV_request_id,TLV_request_id_len,MSG.pdu.request_id);
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_request_id,TLV_request_id_len);
Integer_TLV(TLV_error_status,TLV_error_status_len,MSG.pdu.error_status);
//error_status;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_status,TLV_error_status_len);
Integer_TLV(TLV_error_index,TLV_error_index_len,MSG.pdu.error_index);
//error_index;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_index,TLV_error_index_len);
unsignedcharreturn_tlv_bind[50];
intreturn_tlv_bind_len=0;
BindSequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,MSG);
//varBind*variable_bindings;
Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,return_tlv_bind,return_tlv_bind_len);
}voidMessSequence_TLV(unsignedchar*return_tlv_message,int&
return_tlv_message_len,messageMSG)//versioncommunitysnmppdu,TLV&
return_tlv_Pdu
{unsignedcharTLV_version[10];
intTLV_version_len=0;
unsignedcharTLV_community[10];
intTLV_community_len=0;
Integer_TLV(TLV_version,TLV_version_len,MSG.version);
//versionSequence_TLV(return_tlv_message,return_tlv_message_len,TLV_version,TLV_version_len);
OctetString_TLV(TLV_community,TLV_community_len,MSG.community);
//communitySequence_TLV(return_tlv_message,return_tlv_message_len,TLV_community,TLV_community_len);
unsignedcharreturn_tlv_Pdu[150];
intreturn_tlv_Pdu_len=0;
PduSequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,MSG);
//PDUspdu;
Sequence_TLV(return_tlv_message,return_tlv_message_len,return_tlv_Pdu,return_tlv_Pdu_len);
}voidcreatemessage(char*Buffer,char*pdutype,int&
leng_buffer)
{usingstd:
:
cout;
usingstd:
cin;
endl;
unsignedcharreturn_tlv_message[300];
intreturn_tlv_message_len=0;
messageMSG;
inti=0;
MSG.pdu.pdutype=atoi(pdutype);
cout<
<
"
chooseinputthecommunity"
cin>
>
MSG.community;
chooseinputthename,maxsize:
6"
MSG.pdu.variable_bindings=newstructvarBind[6];
stringinput;
//forinput
input;
while(input!
="
send"
)
{MSG.pdu.variable_bindings[i++].name=input;
}MSG.version=0;
//MSG.community="
public"
MSG.pdu.error_index=0;
MSG.pdu.error_status=0;
MSG.pdu.request_id=abs(rand());
//90...32767
MessSequence_TLV(return_tlv_message,return_tlv_message_len,MSG);
leng_buffer=return_tlv_message_len;
for(intl=0;
return_tlv_message_len;
{cout<
(int)return_tlv_message[l]<
"
Buffer[l]=return_tlv_message[l];
//(int)
//cout<
(int)Buffer[l]<
}cout<
解析和解码代码如下:
voidstrcpyTLV(chartemp_INTEGER[],charget_pdu[],intk,intlen)//字符串拷贝,拷贝value部分
{intbegin=k;
for(intp=0;
p<
len;
p++)
{temp_INTEGER[p]=get_pdu[begin++];
}temp_INTEGER[len]=0;
}voidprinout(chartemp_INTEGER[],boolchange_line)//输出整数value部分
{if(change_line)
{std:
cout<
(int)temp_INTEGER[0]<
}elsestd:
(int)temp_INTEGER[0];
voidprintout_OBJE(chartemp_name[],intlen)//输出标识符
{std:
1.3."
inti=1;
while(i<
len)
{std:
(int)temp_name[i++]<
}std:
voidDcode_version(chartemp_INTEGER[],intlen)//version解析
version:
INTEGER<
len<
prinout(temp_INTEGER,true);
voidDcode_OCTETSTRING(chartemp_OCTETSTRING[],intlen)//community解析
community:
OCTETSTRING<
temp_OCTETSTRING<
voidDcode_PDUTYPE(intTlv_T)//pdutype解析
pdutype:
Tlv_T<
voidDcode_resid(chartemp_INTEGER[],intlen)//requestid解析
{for(intg=0;
g<
g++)
{temp_INTEGER[g]<
=(len-1-g)*8;
}intsum=temp_INTEGER[0];
for(inth=1;
h<
h++)
{sum|=temp_INTEGER[h];
}std:
requestid:
sum<
voidDcode_errorstatus(chartemp_INTEGER[],intlen)//errorstatus解析
errorstatus:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 管理 课程设计 BER 解码 报文 构造 解析