0

我尝试使用 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() 可以工作吗?

也许还有其他要求?

4

1 回答 1

0

但是wireshark没有注册任何网络活动

那不是你在其他讨论中所说的。你说它有效。

那么,是否有一些附加条件可以使 SendTrap() 正常工作?

不,我给你的代码就是你所需要的。

SNMP Trap 接收器是否应该等待我的 SendTrap() 以便 SendTrap() 可以工作?

不,UDP 是无连接的。发送不需要接收器。如果没有接收者,则会将 ICMP 错误发送回发送者。

是否应该在我的计算机中某处注册 OID“1.5.5.5.5.5.5.5”,以便 SendTrap() 可以工作?

不。

于 2014-06-27T09:05:24.250 回答