网络管理课程设计BER编解码报文构造与解析Word文件下载.docx

上传人:b****3 文档编号:7074118 上传时间:2023-05-07 格式:DOCX 页数:17 大小:103.18KB
下载 相关 举报
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第1页
第1页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第2页
第2页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第3页
第3页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第4页
第4页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第5页
第5页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第6页
第6页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第7页
第7页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第8页
第8页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第9页
第9页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第10页
第10页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第11页
第11页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第12页
第12页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第13页
第13页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第14页
第14页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第15页
第15页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第16页
第16页 / 共17页
网络管理课程设计BER编解码报文构造与解析Word文件下载.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

网络管理课程设计BER编解码报文构造与解析Word文件下载.docx

《网络管理课程设计BER编解码报文构造与解析Word文件下载.docx》由会员分享,可在线阅读,更多相关《网络管理课程设计BER编解码报文构造与解析Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。

网络管理课程设计BER编解码报文构造与解析Word文件下载.docx

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:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2