尝试使用此答案使用 net-snmp 减去 MIB 树文件。这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCKAPI_
#include <windows.h>
#include <iostream>
#include <fstream>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/definitions.h>
#include <net-snmp/library/tools.h>
#include <net-snmp/mib_api.h>
#include <net-snmp/library/mib.h>
#include <net-snmp/library/parse.h>
#pragma comment(lib, "WS2_32.lib")
void showTree(struct tree *tree_head, unsigned int level = 0)
{
for (struct tree * tp = tree_head; tp; tp = tp->next_peer)
{
for (size_t i = 0; i < level; ++i)
std::cout << "\t";
std::cout << tp->subid << " " << tp->label << std::endl;
showTree(tp->child_list, level + 1);
}
}
int main(int argc, char* argv[])
{
struct tree *tp;
struct tree *tree_head = NULL;
FILE *fp = NULL;
char str[] = "путь к папке с файлами MIB\\название_файла.mib";
netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_WARNINGS, 2);
netsnmp_ds_toggle_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_SAVE_MIB_DESCRS);
netsnmp_init_mib();
add_mibdir("путь к папке с файлами MIB");
tree_head = read_mib(str);
if (tree_head)
{
std::cout << "Successfully parsed the MIB\n";
}
std::cout << "\nParsing results:\n";
std::cout << tree_head->number_modules << std::endl;
showTree(tree_head); // Рекурсивно выводит дерево
getchar();
return 0;
}
预期结果:推导出的 MIB 树包含来自RFC-1155的核心节点以及来自文件的我的节点和树本身。
结果是:一个 MIB 树不仅包含RFC-1155中的内容,还包含一大堆其他内容,而且我的文件中没有任何信息。即使是第一个节点。
事实证明,我明确传递了从中获取树的文件,他从任何地方获取了所有可能的树,但不是从我的文件中获取。
问题:如何tree从我的文件中获取仍然包含树的类型对象,而不是从库在计算机上找到的所有 MIB 中,除了我的?
结果证明这个解决方案非常简单。NetSNMP 不支持
_模块名称中的字符。在调试消息中,这不会以任何方式报告。只有在尝试使用适当的控制台实用程序读取文件后,我才将其挖掘出来。结果,在
_用-函数替换文件中的所有内容后,它们开始按预期工作。