用VC++6.0实现SNMP协议的方法
2008-11-13 19:34:18 来源:WEB开发网也很爽,只有第一个参数是需要你输入的,而这已经通过SnmpRecvMsg得到了,其他的参数都是需要接收的,看到什么了,对了,request_id,如果你才用异步接收的话,它可很重要的啊,可以帮你标识发送的消息。还有error_status和error_index,记得吗,用在SNMP_PDU_GETBULK操作中,他们的意义是不同的,除此之外,他们用来接收SNMP端返回的错误消息,如果返回全都是0,那就是正确返回了,如果不是,那你就的查一查他们所代表的意思了,一般的SNMP书上都会有介绍。
3、计算返回列表数目,用函数
SNMPAPI_STATUS SnmpCountVbl(
HSNMP_VBL vbl // handle to the variable bindings list
);
将你上一步得到的varbindlist代到里面去就行了,他的返回只是一个整型,使你所得到的变量绑定列表返回的变量数。
4、取得返回结果,用函数
SNMPAPI_STATUS SnmpGetVb(
HSNMP_VBL vbl, // handle to the variable bindings list
smiUINT32 index, // position of the variable binding entry
// in the list
smiLPOID name, // pointer to the structure to receive the
// variable name
smiLPVALUE value // pointer to the structure to receive the
// associated value
);
既然在上一步已经得到了结果数,用一个简单的for循环一次将结果取出吧。该函数有四个参数,第一个在第三步已得到,第二个就是你for循环中的变量值,记住取得变量是从0开始的,后两个参数想想是不是与前面某个函数的参数有点相似。对了,前面我们把他们都置为空,现在SNMP代理将返回值添了进去,我们可以坐享其成了,定义两个变量,接收就行了。提醒一下,对ip地址的接收会有点不同,因为返回值将其封装为一个指针数组了,你需要一个一个的取出来!
看上去工作是做完了,别急,还有一个很重要的环节,难道你没想过创建了这么多东西就不会占用资源吗?当然要占用,而且你不释放他它不会自动释放,前面我们总共介绍了5个重要的句炳,只有会话句炳是在发送和接收消息时都用到的,所以在发送和接收消息以后,你要将其他四个句炳释放掉,那么会话句炳何时释放呢?对了,应该在你应用程序退出的过程中释放掉,进而你会想到创建会话句炳的位置了吧,那就是在构造函数里。以上这些释放句炳资源的函数SNMP API都有提供,如SnmpFreeEntity,SnmpFreeContext,SnmpFreeVbl,SnmpFreePdu,SnmpClose,他们的参数只有一个,就是你要是放得句炳。最后你要清理整个现场,用函数SnmpCleanup()解决他们吧。
一且到此完结,大概步骤就这些了,你也许对SNMP_PDU_SET和SNMP_PDU_TRAP有些不解,前者你可以在第10步追加绑定列表中改变变量值,当然要遵循smiVALUE的结构,将类型和值都添上,填好需要改变的对象标志符,同时在第11步创建PDU中将类型设为SNMP_PDU_SET就行了。
对于想进行SNMP编程的人员,在下以菜鸟的身份给你们提个醒,SNMP编成的过程很死,但精心的设计会使你的程序更加的健壮、高效和容易扩展,我强烈的建议你们看看hp的snmp++,他的源代码很有层次,极易扩展
更多精彩
赞助商链接