我尝试使用 Indy 的组件 TIdSnmp 发送 SNMP 陷阱。(代码是从使用 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 桌面应用程序编译的代码。
SNMP Trap 接收器是否应该等待我的 SendTrap() 以便 SendTrap() 可以工作?(不幸的是,我目前还没有另一台计算机进行实验)应该在我的计算机中某处注册 OID“1.5.5.5.5.5.5.5”,以便 SendTrap() 可以工作吗?
也许还有其他要求?