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など他のマネージャでもトラップを受信できます。