Indy のコンポーネント TIdSnmp を使用して SNMP Trap を送信しようとしました。(コードはIndy コンポーネントを使用した SNMP SendTrap の実装からコピーされました)
void __fastcall TMainForm::btSendTrapClick(TObject *Sender)
{
String myEnterprise = _D("1.5.5.5.5.5.5.5");
String eventType = myEnterprise + _D(".1");
String eventDistance = myEnterprise + _D(".2");
TIdSNMP * idSnmp = 0;
idSnmp = new TIdSNMP(NULL);
idSnmp->Trap->Host = edHost->Text;
idSnmp->Trap->Community = _D("public");
idSnmp->Trap->Enterprise = myEnterprise;
idSnmp->Trap->GenTrap = 6; // I've met such values
idSnmp->Trap->SpecTrap = 1; // somewhere in inet
idSnmp->Trap->MIBAdd(eventType,_D("ftCritical"));
idSnmp->Trap->MIBAdd(eventDistance,_D("2.357"));
idSnmp->SendTrap();
delete idSnmp;
}
ただし、Wireshark はネットワーク アクティビティを登録しません。QuickSendTrap
同じ結果でバリアントを試しました。絶望して、何かを送信するために Indy の UDP コンポーネントを試すことにしました。
void __fastcall TForm1::btFireClick(TObject *Sender)
{
TIdUDPClient* udpClient = 0;
TIdBytes sendData;
myClass* packet = new myClass();
packet->a = 10;
packet->b = 77;
packet->c = "Test";
int size = sizeof(*packet);
sendData = RawToBytes(packet, size);
udpClient = new TIdUDPClient(NULL);
udpClient->Host = "192.168.100.19";
udpClient->Port = 162;
udpClient->SendBuffer(sendData);
delete udpClient;
}
確かにこれは実際の SNMP トラップではありませんが、wireshark では次のように表示されます。
192.168.100.21 192.168.100.19 UDP 54 Source port: 49873 Destination port: snmptrap
Wireshark フィルターは「udp portrange 161-162」です。
データセクションでは、自分の値を見つけることができます。ところで、SNMP コンポーネントは、単純な idSnmp->SendQuery() によって値を取得するために適切に機能し、これは Wireshark によっても登録されます。
では、SendTrap() が適切に機能するために、追加の条件がいくつかありますか?
私は Windows7 の管理者権限を持っています。ファイアウォールがオフになっています。Embarcadero RAD Studio 2010、デスクトップ アプリケーションによってコンパイルされたコード。
SendTrap() が機能するために、SNMP トラップ受信者は SendTrap() を待機する必要がありますか? (残念ながら、現時点では実験用の別のコンピューターを持っていません) SendTrap() が機能するためには、私のコンピューターのどこかに OID "1.5.5.5.5.5.5.5" を登録する必要がありますか?
多分他のいくつかの要件?