Не читается mib-деерво из файла net-snmp
Пытаюсь вычитать файл с MIB-деревом с помощью net-snmp, пользуясь этим ответом. Вот мой код:
#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-ов, которые библиотека нашла на компе, кроме моего?
Ответы (1 шт):
Решение оказалось до смешного простым. NetSNMP не поддерживает символ _ в именах модулей. Причём в отладочных сообщениях об этом ни коим образом не сообщается. Раскопал это, только попробовав прочитать файл соответствующей консольной утилитой.
Как следствие, после замены в файле всех _ на - функции начали работать, как и ожидалось.