[英]How to print an integer and Counter32 value in 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
,我想返回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
INTEGER:12324
STRING:Gi0/1
(但我想解析這個結果並將其用於一些變量,沒有數據類型,例如:在var a
中存儲12132
)。
謝謝!
如果有人仍然有這個問題,我想出了一個不需要使用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;
}
這將保留應用程序配置的其余部分,並且只吐出值,因此您不需要進行標記化。 我縮寫了循環,因此它側重於重要方面。
我有同樣的問題,我得到它與...
unsigned long val64;
val64 = vars->val.counter64->high;
printf("value #%lu is a COUNTER32:\n", val64);
好吧,你總是可以直接操作數據......如你所說,計數器存儲在var-> val.integer中。 但是,從print_variable的輸出中刪除所有LABEL:
前綴的更快方法是設置NETSNMP_DS_LIB_QUICK_PRINT
變量,如下所示:
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, 1);
這將刪除“Counter32:”前綴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.