Как напечатать целое число и значение Counter32 в net-snmp - PullRequest
3 голосов
/ 19 декабря 2011

Я основал этот код, который печатает строковые значения, и он отлично работает:

 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;

Пример: для SNMPv2-SMI::mib-2.17.2.11.0 = INTEGER: 1500 я хочу вернуть 1500 и для 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 (но я хочу проанализировать этот результат и использовать его в некоторых переменных, без типа данных, например: в var a для хранения 12132 ).

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 августа 2015

В случае, если у кого-то все еще есть проблемы с этим, я выяснил альтернативную механику, которая не требует анализа, используя net-snmp 5.7.3:

template<typename T>
static boost::shared_ptr< std::vector<T> > GetVector(std::string user_oid, struct snmp_session * snmp_session) {

    // Other Initialization ....

    char temp_buf[BUFSIZ];
    size_t temp_buf_len = BUFSIZ;
    bool orig_config_val_qp = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
    bool orig_config_val_bv = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_BARE_VALUE);

    // Enforce this for correct output in snprint_variable functions
    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, 1);
    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_BARE_VALUE, 1);

    // oid conversion routines ...

    // Processing loop for response vars (similar to netsnmp/app/snmpbulkwalk.c) ...
    if (vars->type == ASN_OCTET_STR) 
    {
        temp_buf_len = BUFSIZ;
        snprint_variable(temp_buf, temp_buf_len, vars->name, vars->name_length, vars);
        result->push_back(boost::lexical_cast<T>(temp_buf));
    }
    // End Processing loop...

    // Restore configuration
    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, orig_config_val_qp);
    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_BARE_VALUE, orig_config_val_bv);

    return result;
} 

Это оставит остальную часть конфигурации вашего приложения такой, какой она была, и только выдаст значение, так что вам не понадобится токенизироваться. Я сократил цикл так, чтобы он сосредоточился на важных аспектах.

0 голосов
/ 20 мая 2016

У меня была та же проблема, с которой я работал ... ... 1001 *

      unsigned long val64;
      val64 = vars->val.counter64->high;
      printf("value #%lu is a COUNTER32:\n", val64);
0 голосов
/ 20 декабря 2011

Ну, вы всегда можете напрямую манипулировать данными ... Счетчик хранится в 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:".

...