2014-06-27 51 views
0

我试图使用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()可以正常工作?

也许有其他一些要求?

回答

0

但Wireshark不能注册器的任何网络活动

这是不是你在other discussion说。你说它正在工作。

那么,有没有一些additinal条件为了SendTrap()正常工作?

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

SNMP Trap接收器应该等待我的SendTrap()只是为了SendTrap()可以工作吗?

否。UDP是无连接的。接收器不需要发送。如果没有接收方,ICMP错误将被发回给发送方。

应该将OID“1.5.5.5.5.5.5”注册到我的电脑的某个地方,以便SendTrap()可以正常工作?

+0

是的,是错了Wireshark的过滤器。当我用'portrange 161-162'取代'udp portrange 161-162'时,Wireshark抓到了数据包。再次感谢您的帮助! – mli