(ccnupq(CCNU) http://blog.csdn.net/ccnupq/)
说明:
1、pdu的varbind只有OID域有值,值域为空。
2 、扫描这个解码好的PDU,发现它是get操作,检查varbinds的每个OID,一定要每个varbind的OID在mib树中均找到才能get,只要有一个OID有误或者不合法就返回错误。
3、假设已有一个存储设备模拟值或真实值的”存值数据库”;get操作的值从此数据库中取出。
4、假设mib结构已建立,用于和get操作中传入参数的OID进行比较
SnmpMessage GetValue(SnmpMessage SnmpMessageObject)
{
1 SnmpMessage SnmpMessageRespose;//创建一个新对象
2 填写好SnmpMessageRespose的固定参数(version、community communityLen);
3 填写好SnmpMessageRespose.SnmpPdu的固定参数(pduType、requestId、errorIndex、errorStatus);
4 for(逐个取出PDU中的每个varbinds(i))
{
varbinds(i).oid与mib结构中的节点最长比配;
4.1 if(匹配不成功)
{
填写错误索引和错误类型为NOSUCHNAME;
break;
}
4.2 if(匹配成功,但是是标量的非实例节点)
{
填写错误索引和错误类型为NOSUCHNAME;
break;
}
4.3 if(匹配成功且是标量的实例节点[.0结尾])
{
4.3.1 if(不是可读的)
{
填写错误类型NOSUCHNAME和错误索引;
break;
}
4.3.2 else//是可读
{
从数据库中get值;
4.3.3 .1 if(get不成功,即数据库中没有值可取)
{
填写错误类型NOSUCHNAME和错误索引;
break;
}
4.3.3 .2 else//取值成功
{
将取出的值存放到varbind(i)的数据域中;
}
}// 4.3.2
}//4.3
4.4 if(匹配成功,但是是没有索引的表节点)
{
填写错误类型NOSUCHNAME和错误索引;
break;
}//4.4
4.5 if(匹配成功,是没有索引的表节点)
{
将OID是索引一起传入数据库get值;
if(get不成功,即数据库中没有值可取)
{
填写错误类型NOSUCHNAME和错误索引;
break;
}
else //get成功
{
将取出的值存放到varbind(i)的数据域中;
}
}//4.5
}//4
return SnmpMessageRespose;
}