1

WinSNMP を使用して、シンプルで小さな SNMP マネージャー プログラムを作成しています。しかし、トラップイベントを受信できません...誰か助けてくれませんか?

サンプルコードは次のとおりです。

#include <stdio.h>
#include <Winsnmp.h>

SNMPAPI_STATUS CALLBACK MySnmpCallback(
    HSNMP_SESSION hSession,
    HWND hWnd,
    UINT wMsg,
    WPARAM wParam,
    LPARAM lParam,
    LPVOID lpClientData
)
{
    printf("MySnmpCallback!\n");
    return SNMPAPI_SUCCESS;
}

void SnmpTest()
{
    smiUINT32 nMajorVersion;
    smiUINT32 nMinorVersion;
    smiUINT32 nLevel;
    smiUINT32 nTranslateMode;
    smiUINT32 nRetransmitMode;

    SNMPAPI_STATUS statusStartup = SnmpStartupEx(
        &nMajorVersion,
        &nMinorVersion,
        &nLevel,
        &nTranslateMode,
        &nRetransmitMode
    );

    if (SNMPAPI_SUCCESS == statusStartup)
    {
        printf("  MajorVersion = %u\n", nMajorVersion);
        printf("  MinorVersion = %u\n", nMinorVersion);
        printf("         Level = %u\n", nLevel);
        printf("RetransmitMode = %u\n", nRetransmitMode);
        SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2);
        SnmpGetTranslateMode(&nTranslateMode);
        printf(" TranslateMode = %u\n", nTranslateMode);
    }
    else
    {
        printf("SnmpStartup Failed. (%u)\n", SnmpGetLastError(NULL));
    }

    if (SNMPAPI_SUCCESS == statusStartup)
    {
        HSNMP_SESSION hSession = SnmpCreateSession(NULL, NULL, (SNMPAPI_CALLBACK)&MySnmpCallback, NULL);
        if (SNMPAPI_FAILURE != hSession)
        {
            HSNMP_ENTITY localEntity = SnmpStrToEntity(hSession, "0.0.0.0");
            SNMPAPI_STATUS regStatus = SnmpRegister(hSession, localEntity, NULL, NULL, NULL, SNMPAPI_ON);
            if (SNMPAPI_SUCCESS == regStatus)
            {
                while (TRUE)
                {
                    Sleep(100);
                    if (GetKeyState('A') && 0x8000)
                        break;
                }

                SnmpClose(hSession);
            }
            else
            {
                printf("SnmpRegister Failed. (%u)\n", SnmpGetLastError(hSession));
            }
        }
        else
        {
            printf("SnmpCreateSession Failed. (%u)\n", SnmpGetLastError(NULL));
        }
    }

    if (SNMPAPI_SUCCESS == statusStartup)
    {
        SnmpCleanup();
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    SnmpTest();
    return 0;
}

ウィンドウ通知を使用する他のアプローチを試しました。しかし、うまくいきませんでした。

このコードを PowerShell イベントで検証しようとしました。evntwin を開き、PowerShell イベントを追加します。(ID:400/401/402/403) トラップ イベントを発生させるために、powershell を起動して終了しました。SNMP サービスとトラップ サービスが実行されています。そして、上記のコードのループ処理が実行されています。ただし、サンプルプログラムはトラップを受信できません。※Snmpbなど他のマネージャでもトラップを受信できます。

4

0 に答える 0