Мне нужно создать агент SNMP для мониторинга наших программных систем.
Я использую «winsnmp» для написания моего агента расширения SNMP в Visual C ++. Вывод — это x64 DLL, которая зарегистрирована в реестре Windows, загружена «Службой SNMP» и правильно выполнена. Мой агент SNMP может обрабатывать запросы «SNMP_PDU_GET», «SNMP_PDU_GETNEXT», «SNMP_PDU_SET», а также генерировать ловушки SNMP.
Пока все отлично, все отлично работает.
Но теперь мне нужно обработать сложный тип данных «sequence», который представлен как тип «AsnSequence» или константа типа «ASN_SEQUENCE» в «winsnmp». Требуется ответить диспетчеру 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» и заполнить его данными?
Благодарю.
Задача ещё не решена.
Других решений пока нет …