2

必要なのは、ソフトウェア システムを監視するための SNMP エージェントを作成することです。Visual C++ で SNMP 拡張エージェントを作成するために「winsnmp」を使用しています。出力は、Windows レジストリに登録され、「SNMP サービス」によってロードされ、適切に実行される x64 DLL です。私の SNMP エージェントは、「SNMP_PDU_GET」、「SNMP_PDU_GETNEXT」、「SNMP_PDU_SET」要求を処理し、SNMP トラップを生成することができます。これまでのところ、すべてがうまくいっています。

しかし、「winsnmp」で「AsnSequence」型または「ASN_SEQUENCE」型定数として提示される複雑なデータ型「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」のインスタンスを初期化し、データを入力するにはどうすればよいですか?

ありがとう。

4

0 に答える 0