C++解析SNMP报文——伪代码实现

参考点击打开链接

名称解释

SNMP——简单网络管理协议;

MIB——管理信息库,任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等;

SMI——管理信息结构,SMI定义了SNMP框架所用信息的组织、组成和标识,它还为描述MIB对象和描述协议怎样交换信息奠定了基础;

SMI的数据类型:Integer,octet string,OBJECT IDENTIFIER,SEQUENCE,IpAddress,counter,Gauge,time ticks。

MIB对象示例


SNMP报文


说明:0x2表示整型,0x4表示oct string类型,0x30表示sequence类型,0x6表示trap oid类型。

解析流程


  • 接收udp数据:

len=recv(buf,...)

  • 解析报文长度:

ptr=buf;
extract_header(ptr,len,0x30,&msg_len,byte_count);
ptr+=byte_count;

  • 解析版本号:

if(ptr[0] != ox2)
return "不是正确的数据类型";
extract_version(ptr,len,&val,byte_count);
ptr+=byte_count;

  • 解析共同体:

if(ptr[0] != 0x4)
retrun "不是正确的数据类型";
extract_octstring(ptr,...,byte_count);
ptr+=byte_count;

  • 解析pdu类型,如锐捷的pdu为0xa7:

if(ptr[0] != 0xa7)
return "不是正确的数据类型";
extract_pdutype(ptr,...,byte_count);
ptr+=byte_count;

  • 解析request id:

if(ptr[0] != ox2)
return "不是正确的数据类型";
extract_request_id(ptr,...,byte_count);
ptr+=byte_count;

  • 解析状态码,为整型:

if(ptr[0] != ox2)
return "不是正确的数据类型";
extract_error_status(ptr,...,byte_count);
ptr+byte_count;

  • 解析错误索引:

if(ptr[0] != ox2)
return "不是正确的数据类型";
extract_error_index(ptr,...,byte_count);
ptr+=byte_count;

  • 解析variable binding:

if(ptr[0] != 0x30)
return "不是正确的数据类型";
extract_variable_binding(ptr,...,byte_count);
ptr+=byte_count;

  • 解析系统更新时间字段:

if(ptr[0] != 0x30)
return "不是正确的数据类型";
extract_update_time(ptr,...,&seq_len,byte_count);
ptr+=byte_count;
ptr+=seq_len;

  • 解析trap oid长度:

if(ptr[0] != 0x30)
return "不是正确的数据类型";
extract_trap_oidlen(ptr,...,&seq_len,byte_count);
ptr+=byte_count;
ptr+=seq_len;

  • 解析具体的oid的key-value值,此处解析的都是企业私有协议,按照企业文档解析对应的类型即可,如解析oct string的mac地址:

  • 解析mac key的变长字段:

if(ptr[0] != 0x30)
return "不是正确的数据类型";
extract_mac_ken_len(ptr,...,&seq_len,byte_count);
ptr+=byte_count;
ptr+=seq_len;

  • 解析mac的oid:

if(ptr[0] != ox6)
return "不是正确的数据类型";
extract_mac_oid_len(ptr,...,&seq_len,byte_count);
ptr+=byte_count;
ptr+=seq_len;

  • 获取oct string类型的mac地址:

if(ptr[0] != 0x4)
retrun "不是正确的数据类型";
extract_mac_oid_value(ptr,...,&mac_len,byte_count);

至此解析成功mac地址,其他的企业oid字段解析同理。





猜你喜欢

转载自blog.csdn.net/lxf20054658/article/details/62046419
今日推荐