在c ++ builder和indy中实现Snmp代理

时间:2014-06-23 09:12:28

标签: c++builder snmp indy

我有一个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的工作示例的一些评论:)

2 个答案:

答案 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