Windows — Агент расширения SNMP C ++ — как работать с AsnSequence?

Мне нужно создать агент 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» и заполнить его данными?

Благодарю.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]