Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在网络snmp中打印整数和计数器32值_C++_Linux_Network Programming_Network Protocols_Net Snmp - Fatal编程技术网

C++ 如何在网络snmp中打印整数和计数器32值

C++ 如何在网络snmp中打印整数和计数器32值,c++,linux,network-programming,network-protocols,net-snmp,C++,Linux,Network Programming,Network Protocols,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; fo

我创建了这段打印字符串值的代码,它运行良好:

 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.2.1012=STRING:“千兆以太网容器”
,它返回
“千兆以太网容器”

但我尝试了整数值,但没有成功:

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=计数器32: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


谢谢

好吧,你总是可以直接操作数据。。。如您所述,计数器存储在var->val.integer中。但是从print\u变量的输出中删除所有
标签:
前缀的更快方法是设置
NETSNMP\u DS\u LIB\u QUICK\u print
变量,如下所示:

netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, 1);

这将删除“Counter32:”前缀。

如果有人对此仍有问题,我找到了一种不需要使用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;
} 
模板
静态boost::shared_ptrGetVector(std::string user_oid,struct snmp_会话*snmp_会话){
//其他初始化。。。。
炭温度buf[BUFSIZ];
尺寸、温度、长度=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_值);
//在snprint_变量函数中强制执行此命令以获得正确的输出
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_值,1);
//oid转换例程。。。
//响应变量的处理循环(类似于netsnmp/app/snmpbulkwalk.c)。。。
如果(变量->类型==ASN\u八位字节\u STR)
{
temp_buf_len=BUFSIZ;
snprint_变量(temp_buf,temp_buf_len,vars->name,vars->name_length,vars);
结果->推回(boost::词法转换(temp\u buf));
}
//结束处理循环。。。
//恢复配置
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);
返回结果;
} 

这将使应用程序配置的其余部分保持原样,只输出值,因此不需要标记化。我缩短了循环,以便它集中在重要的方面

我也有同样的问题,我用这个解决了它

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

它打印的是什么而不是您想要的数字呢?谢谢,它打印的是所有没有标签前缀的值,但是如何使用这些结果,而不仅仅是打印它们。要使用它们,您需要深入了解您已经提到的var->val联合。每个SNMP类型将使用其中一个内部值。请注意,基于整数的值(如Integer32)实际上在val union中使用long数据类型。谢谢!我只需要知道这两个“netsnmp\u ds\u set\u boolean”命令。你救了我!