SNMP协议原语的C语言算法实现(二):Set

(ccnupq(CCNU)     http://blog.csdn.net/ccnupq/)

说明:

1set的值由setPDU传进来,pduvarbind既有OID,又有OID对应的实际值。

2 、扫描这个解码好的PDU  发现它是set操作,检查varbinds的每个OIDOID的实际值,一定要每个varbindOIDOID实际值都存在且合法才能set,只要有一个OID有误或OID的实际值不合法就返回错误。

3、假设已有一个存储设备模拟值或真实值的”存值数据库”;set操作针对此数据库完成。

4、假设mib结构已建立,用于和set操作中传入参数的OID进行比较

 

算法如下:

SnmpMessage SetValue(SnmpMessage SnmpMessageObject)

{

1  SnmpMessage SnmpMessageRespose//创建一个新对象

2  填写好SnmpMessageRespose的固定参数(versioncommunity communityLen);

3 填写好SnmpMessageRespose.SnmpPdu的固定参数(pduTyperequestIderrorIndexerrorStatus;

    4  for(逐个取出PDU中的每个varbinds(i)

     

varbinds(i).oidmib结构中的节点最长比配;

         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;

}

你可能感兴趣的:(SNMP协议原语的C语言算法实现(二):Set)