1

我希望 SNMP 代理根据源请求者做出不同的响应,但找不到一种方法来神奇地传达一些数据以使其可被 SNMP 代理区分。

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

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

4

1 回答 1

0

很抱歉回答我自己的问题。

最后我发现了以下技巧来规避这个问题:在目标 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 {
                       ...
                    }
于 2010-11-17T03:04:05.053 回答