2010-11-16 111 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 { 
         ... 
        } 
相關問題