0

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" を登録する必要がありますか?

多分他のいくつかの要件?

4

1 に答える 1