2010-11-16 53 views
1

我希望SNMP代理根据源请求者的不同做出响应,但无法找到一种方法来传递某些数据以使SNMP代理区分它。如何使用net-snmp将请求特定的数据设置为SNMP代理?

我试过的设置是netsnmp_session结构和netsnmp_pdu结构。因为它们是snmp_send的两个参数。我试图促成的数据字段是myvoid和callback_magic。

但不幸的是,在SNMP代理上,收到的数据都是0,这不是我在SNMP客户端上设置的。

回答

0

对不起回答myselv的问题。

最后,我发现了以下技巧来规避此问题: 在目标SNMP对象之后立即插入一个众所周知的SNMP对象(如ifNumber)以标识特定的SNMP查询。

代理中的处理程序函数应该检查当前变量旁边的变量,看它是否是众所周知的SNMP对象ifNumber。如果是,那么查询来自你,它使用NET-SNMP API来形成这个查询的变量列表。

客户端代码:

oid dest_OID[ MAX_OID_LEN ] = {0}; 
    size_t dest_OID_len = COUNT_OF(dest_OID); 
    get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len); 
    snmp_add_null_var(pdu, dest_OID, dest_OID_len); 

在代理方:

int get_status(netsnmp_mib_handler *handler, 
      netsnmp_handler_registration *reginfo, 
      netsnmp_agent_request_info *reqinfo, 
      netsnmp_request_info *requests) 
{ 
    switch (reqinfo->mode) { 

     case MODE_GET: 
      { 

        bool is_sent_by_manager = false; 
        if(requests->requestvb->next_variable) 
        { 
         struct variable_list * v = requests->requestvb->next_variable; 

         oid dest_OID[ MAX_OID_LEN ] = {0}; 
         size_t dest_OID_len = COUNT_OF(dest_OID); 
         get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len); 

         const int nbytes = v->name_length * sizeof(v->name[0]); 
         if(dest_OID_len >= v->name_length 
          && memcmp(dest_OID, v->name, nbytes) == 0) { 
          is_sent_by_manager = true; 
         } 
        } 

        if(is_sent_by_manager) { 
         ... 
        } 
        else { 
         ... 
        } 
相关问题