代码之家  ›  专栏  ›  技术社区  ›  zhaorufei

如何使用net-snmp将特定于请求的数据设置为snmp代理?

  •  1
  • zhaorufei  · 技术社区  · 15 年前

    我希望snmp代理根据源请求者的不同做出不同的响应,但找不到一种方法来神奇地传递一些数据,以使snmp代理能够区分这些数据。

    我尝试的设置是 netsnmp_session 结构和 netsnmp_pdu 结构。因为它们是 snmp_send . 我试图提供的数据字段是myvoid和callback_magic。

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   zhaorufei    15 年前

    很抱歉回答我的问题。

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

    agent中的handler函数应检查当前变量旁边的变量,以查看 它就是众所周知的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 {
                           ...
                        }