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

How to figure out if requested OID is in Table with net-snmp API?

本文关键字:API net-snmp 请求 何确定 OID 是否      更新时间:2023-10-16

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

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

如何检查请求的获取或设置请求的 OID 是否是 MIB 中具有 Net-SNMP API 的表的字段或条目?

这是我为找出表元素而准备的一些函数:

如果 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;
}