我试图使用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