Не читается 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 шт):

Автор решения: V-Mor

Решение оказалось до смешного простым. NetSNMP не поддерживает символ _ в именах модулей. Причём в отладочных сообщениях об этом ни коим образом не сообщается. Раскопал это, только попробовав прочитать файл соответствующей консольной утилитой.

Как следствие, после замены в файле всех _ на - функции начали работать, как и ожидалось.

→ Ссылка