如何获取与NET-SNMP注册的回调关联的变量

时间:2016-03-03 18:29:57

标签: c callback snmp net-snmp

我一直在关注找到here的NET-SNMP教程。

设置-上级:

在示例中有这行代码。

 netsnmp_register_long_instance("nstAgentSubagentObject",
                              nstAgentSubagentObject_oid,
                              OID_LENGTH(nstAgentSubagentObject_oid),
                              &nstAgentSubagentObject, NULL);

在做了一些调查之后,我发现NULL实际上是这个签名的回调指针。

int CallBackFunction(netsnmp_mib_handler*handler, netsnmp_handler_registration*reginfo, 
netsnmp_agent_request_info*reqinfo, netsnmp_request_info*requests)

所以我可以像这样重写上一行代码,

netsnmp_register_long_instance("nstAgentSubagentObject",
                              nstAgentSubagentObject_oid,
                              OID_LENGTH(nstAgentSubagentObject_oid),
                              &nstAgentSubagentObject, &CallBackFunction);

每次在我的一个变量上使用snmpget命令时,都会调用回调函数CallBackFunction。哪个好,但我找不到一种方法来获取使用回调AKA &nstAgentSubagentObject注册的值的指针。

我查看了4个参数的数据类型,无法弄清楚我错过了什么。

问题:

有没有办法获得使用回调函数注册的&nstAgentSubagentObject指针?

有没有更好的方法来关联这些回调?我在net-snmp的通用回调函数here上找到了一些文档,但是如果我能用现有的指针得到指针,我就可以全部设置。

谢谢!

1 个答案:

答案 0 :(得分:1)

long nstAgentSubagentObject;
size_t long_size = sizeof(long);

int handle_nstAgentSubagentObject(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
{
    printf("handle_nstAgentSubagentObject\n");    

    switch(reqinfo->mode) {
        case MODE_GET:
            nstAgentSubagentObject = 100500;
            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
                                         &nstAgentSubagentObject,
                                         long_size);
            break;
        default:
            snmp_log(LOG_ERR, "unknown mode (%d) in handle_totalClients\n", reqinfo->mode );
            return SNMP_ERR_GENERR;
    }
    return SNMP_ERR_NOERROR;
}

五月对某人有用

Counter64用法(子代理agentx):

struct counter64 createdFlowsAll;
size_t counter64_size = sizeof(struct counter64); // sizeof(U64);

netsnmp_register_instance (
        netsnmp_create_handler_registration("createdFlowsAll", handle_createdFlowsAll, createdFlowsAll_oid, OID_LENGTH(createdFlowsAll_oid), HANDLER_CAN_RONLY
    ));

int handle_createdFlowsAll(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
{
    size_t i;
    u_long createdFlowsAll_t;

    switch(reqinfo->mode) {
        case MODE_GET:
            createdFlowsAll_t = 100500;

            // createdFlowsAll.high = createdFlowsAll_t & 0xffffffff00000000ULL;
            // createdFlowsAll.low = createdFlowsAll_t & 0x00000000ffffffffULL;

            createdFlowsAll.high = createdFlowsAll_t >> 32;
            createdFlowsAll.low = createdFlowsAll_t & 0xffffffff;

            snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64,
                                     &createdFlowsAll,
                                     counter64_size);
            break;
        default:
            snmp_log(LOG_ERR, "unknown mode (%d) in handle_createdFlowsAll\n", reqinfo->mode );
            return SNMP_ERR_GENERR;
    }
    return SNMP_ERR_NOERROR;
}