我試圖使用Indy的組件TIdSnmp發送SNMP陷阱。 (代碼是從Implementing SNMP SendTrap using Indy components複製)Indy的SNMP陷阱發送任何東西
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」
而且在數據部分,我可以找到我的價值觀。通過簡單的idSnmp-> SendQuery()方法,SNMP組件可以正常工作以獲取值,並且這也由wireshark註冊。
那麼,有沒有一些additinal條件爲了SendTrap()正常工作?
我有Windows7管理權限。防火牆已關閉。代碼由Embarcadero RAD Studio 2010編譯,桌面應用程序。
SNMP Trap接收器應該等待我的SendTrap()只是爲了SendTrap()可以工作? (不幸的是,我目前還沒有另外一臺計算機用於實驗) 應該將OID「1.5.5.5.5.5.5.5」註冊到我的計算機的某個地方,以便SendTrap()可以正常工作?
也許有其他一些要求?
是的,是錯了Wireshark的過濾器。當我用'portrange 161-162'取代'udp portrange 161-162'時,Wireshark抓到了數據包。再次感謝您的幫助! – mli