如何使用net-snmp API确定请求的OID是否在表中?

时间:2018-06-12 09:43:20

标签: c++ snmp net-snmp

我正致力于Windows SNMP代理扩展的解决方案。同时,我使用Net-SNMP从MIB文件中读取和加载OID。将旧的SNMP对象与Net-SNMP对象相匹配在C ++中是一项艰苦的工作,我做得非常严厉。现在,Table对象的Set,Get-Next请求中出现了很多问题。

重要的是如何设置现在引用表条目或字段的OID。

如何检查Get或Set请求的请求OID是否是MIB中使用Net-SNMP API的表的字段或条目?

1 个答案:

答案 0 :(得分:0)

这是我准备计算表格元素的一些功能:

如果Oid是桌子的一个字段:

BOOL IsInTable(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (tbl->parent && strstr(strlwr(tbl->parent->label), "entry") > 0) {
            return true;
        }
    }
    return false;
}

如果Oid是表的根:

BOOL IsTableRoot(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (strstr(strlwr(tbl->label), "table") > 0) {
            return true;
        }
    }
    return false;
}

如果Oid是桌子的入口或第一个孩子:

BOOL IsTableEntry(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (strstr(strlwr(tbl->label), "entry") > 0) {
            return true;
        }
    }
    return false;
}