我尝试使用Indy的组件TIdSnmp发送SNMP陷阱。 (代码是从Implementing SNMP SendTrap using Indy components复制的)
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()可以在我的电脑中注册吗?
也许有其他一些要求?
答案 0 :(得分:0)
但wireshark并未注册任何网络活动
这不是你在other discussion中所说的。你说它有效。
那么,是否有一些附加条件才能使SendTrap()正常工作?
没有。我给你的代码就是你所需要的。
SNMP Trap接收器是否应该等待我的SendTrap()才能使SendTrap()工作?
没有。 UDP是无连接的。发送时不需要接收器。如果没有接收方,则会将ICMP错误发送回发送方。
应该是OID" 1.5.5.5.5.5.5.5"只是为了SendTrap()可以在我的电脑中注册吗?
没有