3

文字列値を出力するこのコードを作成しましたが、正常に動作します。

 add_mibdir("."); 
 pdu = snmp_pdu_create(SNMP_MSG_GET);

 read_objid(if_index, id_oid, &id_len);
 snmp_add_null_var(pdu, id_oid, id_len);    
 status = snmp_synch_response(sess_handle,pdu,&response);

 int count=1;
 for(vars = response->variables; vars; vars = vars->next_variable) 
  {
    if (vars->type == ASN_OCTET_STR) 
    {
        char *sp = (char *)malloc(1 + vars->val_len);
        memcpy(sp, vars->val.string, vars->val_len);
        sp[vars->val_len] = '\0';
        printf("value #%d is a string: %s\n", count++, sp);
        printf("%s\n",vars->val.string);
        free(sp);
}

  }

例: の場合SNMPv2-SMI::mib-2.47.1.1.1.1.2.1012 = STRING: "GigabitEthernet Container"、 を返します"GigabitEthernet Container"

しかし、整数値に対してそれを試しましたが、うまくいきませんでした:

for(vars = response->variables; vars; vars = vars->next_variable)
    printf("%ld",(long int)vars->val.integer);//it returns large numbers;

例: for SNMPv2-SMI::mib-2.17.2.11.0 = INTEGER: 1500、戻りたい1500および for戻りIF-MIB::ifOutBroadcastPkts.10103 = Counter32: 14011112たい14011112

私が使用する場合:

for(vars = response->variables; vars; vars = vars->next_variable)
    print_variable(vars->name, vars->name_length, vars);

Counter32:12132、またはINTEGER:12324、またはを返しますSTRING:Gi0/1(ただし、この結果を解析して、データ型なしでいくつかの変数に使用したい、たとえば、 in var ato store 12132)。

ありがとう!

4

3 に答える 3

0

まあ、いつでもデータを直接操作できます... カウンターは var->val.integer に保存されています。しかし、すべてのLABEL:プレフィックスを print_variable の出力から削除するためのより高速な方法は、次のNETSNMP_DS_LIB_QUICK_PRINTように変数を設定することです。

netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, 1);

これにより、「Counter32:」プレフィックスが削除されます。

于 2011-12-19T21:52:50.227 に答える