2011-12-19 29 views
3

我創辦這個代碼打印字符串值,它工作正常:如何打印的net-snmp的整數和計數器值

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,我想回到1500IF-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:12324STRING:Gi0/1(但我想解析這個結果並將其用於某些變量,而不使用數據類型,例如:在var a中存儲12132)。

謝謝!

+0

是什麼打印的,而不是你想要的數字嗎? – 2011-12-19 14:40:18

回答

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); 

這將去掉「計數器:」前綴。

+0

謝謝你,它會打印所有沒有標籤前綴的值,但是如何使用這些結果,而不僅僅是打印它們。 – user1101467 2011-12-20 06:48:46

+0

要使用它們,您需要深入您已經提到的var-> val union。每種SNMP類型都將使用這些內部值之一。請注意,基於整數的值(如Integer32)實際上使用val union中的長數據類型。 – 2011-12-21 04:09:37

1

在任何人的情況下仍然有問題,這一點,我想通了,不需要使用的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

謝謝!我只需要知道這兩個'netsnmp_ds_set_boolean'命令。你救了我! – 2015-11-06 04:08:46

0

我有我得到了它這個工作同樣的問題...

 unsigned long val64; 
     val64 = vars->val.counter64->high; 
     printf("value #%lu is a COUNTER32:\n", val64);