(ccnupq(CCNU) http://blog.csdn.net/ccnupq/)
说明:
1、set的值由set的PDU传进来,pdu的varbind既有OID,又有OID对应的实际值。
2 、扫描这个解码好的PDU 发现它是set操作,检查varbinds的每个OID和OID的实际值,一定要每个varbind的OID和OID实际值都存在且合法才能set,只要有一个OID有误或OID的实际值不合法就返回错误。
3、假设已有一个存储设备模拟值或真实值的”存值数据库”;set操作针对此数据库完成。
4、假设mib结构已建立,用于和set操作中传入参数的OID进行比较
算法如下:
SnmpMessage SetValue(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(匹配不成功)
{
填写错误索引和错误类型;
break;
}
4.2 if(匹配成功且是标量的实例节点[.0结尾])
{
4.2.1 if(不是可读可写)
{
填写错误类型NOSUCHNAME和错误索引;
break;
}
4.2.2 if(该oid绑定的值不符合syntax)
{
填写错误类型BADUALUE和错误索引;
break;
}
4.2.3 else//该oid绑定的值符合syntax并且可读可写
{
将该结点的值从数据库中读出,放入oldValueList中保存,以便回卷;
修改标量结点的值,即set值;
4.2.3 .1 if(set成功)
{
继续到下一个varbind;
}
4.2.3 .2 else
{
break;
}
}
}
4.3 if(匹配成功,最长到了表的叶子结点[含有index k==2)
{
4.3.1 if(要求删除一行)
{
存储旧值,以便回卷;
开始删除;
4.3.1 .1 if(删除成功)
{
continue;
}
4.3.1.2 else
{
break;
}
}
4.3.2 if(该节点不可写)
{
填写错误类型READONLY和错误索引;
break;
}
4.3.3 if(传入的值不符合syntax)
{
填写错误类型READONLY和错误索引;
break;
}
4.3.4 if(传入的值符合syntax,且是可读可写,且不是删除一行,开始修改)
{
4.3.4 .1 if(从存值数据库中读取数据成功)
{
存旧值;
将新值写入;
if(新值写入成功)
{
continue;
}
else
{
break;
}
}
4.3.4.2 else//根据当前索引在存之数据库中没有找到,创建一行
{
存旧值;
if(创建新行成功)
{
continue;
}
else
{
break;
}
}// 4.3.4 .2
}// 4.3.4
}//4.3
}//4
if(错误索引被修改了,即出现了错误)
{
回卷;
}
return SnmpMessageRespose;
}