2011-12-19 28 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);