我需要的是创建 SNMP 代理来监控我们的软件系统。我正在使用“winsnmp”在 Visual C++ 中编写我的 SNMP 扩展代理。输出是 x64 DLL,它在 Windows 注册表中注册,由“SNMP 服务”加载并正确执行。我的 SNMP 代理能够处理“SNMP_PDU_GET”、“SNMP_PDU_GETNEXT”、“SNMP_PDU_SET”请求以及生成 SNMP 陷阱。到目前为止一切都很好,一切正常。
但是现在我需要处理复杂的数据类型“sequence”,它在“winsnmp”中显示为“AsnSequence”类型或“ASN_SEQUENCE”类型常量。要求是用包含多条记录的表回复 SNMP 管理器。该表具有特定的结构,这里是示例 MIB 片段:
...
hrTestTable OBJECT-TYPE
SYNTAX SEQUENCE OF HrTestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"sequence"
::= { BMS_ibm_wsmq 3 }
hrTestEntry OBJECT-TYPE
SYNTAX HrTestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Table row"
INDEX { hrTestIndex }
::= { hrTestTable 1 }
HrTestEntry ::= SEQUENCE {
hrTestIndex Integer32,
hrTestType AutonomousType,
hrTestDescr DisplayString
}
hrTestIndex OBJECT-TYPE
SYNTAX Integer32 (1..2147483647)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"indexColumn1"
::= { hrTestEntry 1 }
hrTestType OBJECT-TYPE
SYNTAX AutonomousType
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"column1"
::= { hrTestEntry 2 }
hrTestDescr OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"column2"
::= { hrTestEntry 3 }
...
一旦 SNMP 管理器请求整个表,代理就会收到“SNMP_PDU_GETNEXT”请求:
BOOL SNMP_FUNC_TYPE SnmpExtensionQuery(BYTE operation, SnmpVarBindList *variableBindings, AsnInteger32 *errorStatus, AsnInteger32 *errorIndex) {
…
for (unsigned int index = 0; index < variableBindings->len; index++) {
*errorStatus = SNMP_ERRORSTATUS_NOERROR;
switch (operation) {
…
case SNMP_PDU_GETNEXT:
…
*errorStatus = GET_SEQUENCE(&variableBindings->list[index]);
…
…
};
…
多变的
"&variableBindings->list[index].name" points to "hrTestIndex" at "index=0"
"&variableBindings->list[index].name" points to "hrTestType" at "index=1"
"&variableBindings->list[index].name" points to "hrTestDescr" at "index=2"
对于所有这些情况,“&variableBindings->list[index].value.asnType”是“ASN_NULL”。
我怀疑,产生响应“&variableBindings->list[index].value.asnType”必须用“ASN_SEQUENCE”初始化,“&variableBindings->list[index].value.asnValue.sequence”应该用“AsnSequence”初始化。
那么,我说的对吗?
如何初始化“AsnSequence”的实例并用数据填充它?
谢谢。