使用Indy组件实现SNMP SendTrap

时间:2014-06-25 05:39:59

标签: snmp indy c++builder-2010

我需要通过SNMP在C ++ Builder上报告我的应用程序中的错误。

我开始使用Indy组件实现SNMP 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的工作示例的一些评论:)

1 个答案:

答案 0 :(得分:0)

您没有使用任何值填充TIdSNMP::Trap。这就是TIdSNMP::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 = 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;
}

或者,您可以改为使用TIdSNMP::QuickSendTrap()

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");

    TStringList *names = new TStringList;
    names->Add(eventType);
    names->Add(eventDistance);

    TStringList *values = new TStringList;
    values->AddObject(_D("ftCritical"), (TObject*)ASN1_OCTSTR);
    values->AddObject(_D("2.357"), (TObject*)ASN1_OCTSTR);

    TIdSNMP *idSnmp = new TIdSNMP(NULL);
    idSnmp->QuickSendTrap(edHost->Text, myEnterprise, _D("public"), 162, 6, 1, names, values);
    delete idSnmp;

    delete names;
    delete values;
}

或者,如果您正在为移动设备进行编译:

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");

    TIdMIBValueList *mibs = new TIdMIBValueList;
    mibs->Add(TIdMIBValue(eventType, _D("ftCritical"), ASN1_OCTSTR));
    mibs->Add(TIdMIBValue(eventDistance, _D("2.357"), ASN1_OCTSTR));

    TIdSNMP *idSnmp = new TIdSNMP(NULL);
    idSnmp->QuickSendTrap(edHost->Text, myEnterprise, _D("public"), 162, 6, 1, mibs);
    delete idSnmp;

    delete mibs;
}