我有一个c ++应用程序,它使用Indy组件进行TCP通信。 现在我需要实现SNMP代理(?)才能响应请求 关于应用程序的状态通过SNMP。 我决定也使用Indy组件来完成这项任务。 也许有一些标准的方法来实现这个?
获取某些值的SNMP组件非常有效。 但我找不到一些如何通过snmp从我的应用程序返回值的示例。
根据Remy Lebeau的建议,我已经开始实施SendTrap。
void __fastcall TMainForm::btSendTrapClick(TObject *Sender)
{
UnicodeString myEnterprise = "1.5.5.5.5.5.5.5";
UnicodeString eventType = "1.5.5.5.5.5.5.5.1";
UnicodeString eventDistance = "1.5.5.5.5.5.5.5.2";
TIdSNMP * idSnmp = 0;
TSNMPInfo * infoSnmp = 0;
idSnmp = new TIdSNMP(NULL);
infoSnmp = new TSNMPInfo(idSnmp);
idSnmp->Host = edHost->Text;
idSnmp->Community = "public";
infoSnmp->Host = edHost->Text;
infoSnmp->Community = "public";
infoSnmp->Enterprise = myEnterprise;
infoSnmp->GenTrap = 6; // I've met such values
infoSnmp->SpecTrap = 1; // somewhere in inet
infoSnmp->MIBAdd(eventType,"ftCritical");
infoSnmp->MIBAdd(eventDistance,"2.357");
idSnmp->SendTrap();
delete idSnmp;
}
但是当我运行应用程序时,我的系统中没有udp活动。 当我运行这样的东西时
idSnmp->QuickSend(sysDescr, "public", edHost->Text, val);
wireshark秀 192.168.100.21 192.168.100.19 SNMP 82 get-request 1.3.6.1.2.1.1.3.0
但当idSnmp->SendTrap()
wireshark什么也看不见时
(对于wireshark的过滤器在两种情况下都是UDP端口范围161-162)
我很高兴看到有关我的代码或可能是SendTrap的工作示例的一些评论:)
答案 0 :(得分:0)
Indy没有SNMP服务器组件。要允许应用程序从您的应用程序请求SNMP值,您必须实现自己的SNMP服务器,例如使用TIdUDPServer
及其OnUDPRead
事件,然后手动解析SNMP请求。
另一种选择是让外部应用在您的应用中注册自己,然后您的应用可以使用TIdSNMP.SendTrap()
在需要时将状态更新推送到已注册的应用。
答案 1 :(得分:0)
看起来你根本没有看到陷阱离开你的主人。我看到这是不久前的,但这对我有用......稍微解释一下我的代码:
void SendTrap(int atcsfield)
{
TIdSNMP *snmp = new TIdSNMP(0);
snmp->Trap->Clear();
snmp->Trap->Version = 2;
snmp->Trap->Community=String(cfg.snmp.community);
snmp->Trap->TimeTicks = GetTickCount() - InitialTickCount;
snmp->Trap->Enterprise=String(cfg.snmp.oid);
snmp->Trap->GenTrap=6;
snmp->Trap->SpecTrap=1;
for(int i=0;i<MAX_VARBINDS;i++)
{
if(svb[i].Length())
{
varb.sprintf("%s.1.%d",BaseOID.c_str(),i);
snmp->Trap->MIBAdd(varb,svb[i], ASN1_OCTSTR);
}
}
for(int i=0;i<MAX_VARBINDS;i++)
{
if(ivb[i]!=-1)
{
varb.sprintf("%s.1.%d",BaseOID.c_str(),i);
snmp->Trap->MIBAdd(varb, ivb[i], ASN1_INT);
}
}
snmp->Host = ManagerIpList->Strings[j];
snmp->SendTrap();
}
我发现每次发送陷阱时都需要Clear()。在工作代码中,我实例化TIdSNMP组件,然后调用SendTrap()。我有三个IP目标,必须调用Clear()向每个目标发送一个陷阱。
HTH