0

我在 c++builder Xe(清单代码 1)中创建了以下例程,使用 Indi 组件 TIdSNMP 来查询代理 snmp。

SendQuery的调用失败,连接正常,但代理始终不返回任何内容。

我还尝试使用QuickSend方法(清单代码 2)查询代理,在这种情况下,第二个例程工作正确,所以我想我在使用第一个例程时犯了一些错误。

有人能告诉我在第一个例程中我哪里错了吗?

最好的问候,恩佐

清单 1

  void __fastcall TForm1::LabelSimpleSnmpCallClick(TObject * Sender)
    {
        String s1, s2, hostTarget = Edit_SnmpServer->Text, sysDescr = "1.3.6.1.2.1.1.1.0", sysUpTime = "1.3.6.1.2.1.1.3.0";

        TIdSNMP * clientSnmp = 0;
        TSNMPInfo * infoSnmp = 0;
        std::auto_ptr< TStringList >sl1(new TStringList());
        std::auto_ptr< TStringList >sl2(new TStringList());

        Mylog(Format("Test simple SNMP call on server [%s]", ARRAYOFCONST((hostTarget))));
        try
        {
            __try
            {
                clientSnmp                 = new TIdSNMP(NULL);
                clientSnmp->Host           = hostTarget;
                clientSnmp->Community      = "pubblic";
                clientSnmp->ReceiveTimeout = 6000;
                clientSnmp->Connect();
                if (clientSnmp->Connected())
                {
                    clientSnmp->Query->Clear();
                    clientSnmp->Query->MIBAdd(sysDescr, "");
                    clientSnmp->Query->MIBAdd(sysUpTime, "");
                    clientSnmp->Query->PDUType = PDUGetRequest;
                    clientSnmp->SendQuery();
                    infoSnmp = clientSnmp->Reply;

                    if (infoSnmp->ValueCount > 0)
                    {
                        sl1->Clear();
                        sl2->Clear();
                        sl1->AddStrings(infoSnmp->MIBOID);
                        sl2->AddStrings(infoSnmp->MIBValue);

                        for (int idx = 0; idx < sl1->Count; idx++)
                        {
                            s1 = sl1->Strings[idx];
                            s2 = sl2->Strings[idx];
                            Mylog(Format("Query on [%s] : [%s] => [%s]", ARRAYOFCONST((hostTarget, s1, s2))));
                        }
                    }
                    else
                    {
                        Mylog("*** No anwser *** ");
                    }
                }
                else
                {
                    Mylog("*** No connected *** ");
                }
            }
            __finally
            {
                if (clientSnmp)
                {
                    delete clientSnmp;
                    clientSnmp = 0;
                }
            }
        }
        catch (Exception & ex)
        {
            Mylog(Format("ERROR [%s] ", ARRAYOFCONST((ex.Message))));
        }

    }

清单 2

void __fastcall TForm1::LabelQuickSendClick(TObject * Sender)
{
    TIdSNMP * clientSnmp = 0;
    String hostTarget    = Edit_SnmpServer->Text, sysDescr = "1.3.6.1.2.1.1.1.0", sysUpTime = "1.3.6.1.2.1.1.3.0", val;

    __try
    {
        clientSnmp                 = new TIdSNMP(NULL);
        clientSnmp->ReceiveTimeout = 6000;
        clientSnmp->QuickSend(sysDescr, "public", hostTarget, val);
        Mylog(Format("Query on [%s] : [%s] => [%s]", ARRAYOFCONST((hostTarget, sysDescr, val))));
        clientSnmp->QuickSend(sysUpTime, "public", hostTarget, val);
        Mylog(Format("Query on [%s] : [%s] => [%s]", ARRAYOFCONST((hostTarget, sysUpTime, val))));
    }
    __finally
    {
        delete clientSnmp;
    }

}
4

1 回答 1

1

在清单 1 中,您将其设置Community"pubblic",但在清单 2 中,您将其设置为"public"。这在 SNMP 中有很大的不同。

至于其余的代码,我建议进行以下更改以简化代码:

void __fastcall TForm1::LabelSimpleSnmpCallClick(TObject * Sender)
{
    String hostTarget = Edit_SnmpServer->Text;
    String sysDescr = "1.3.6.1.2.1.1.1.0";
    String sysUpTime = "1.3.6.1.2.1.1.3.0";

    Mylog(Format("Test simple SNMP call on server [%s]", ARRAYOFCONST((hostTarget))));
    try
    {
        std::auto_ptr<TIdSNMP> clientSnmp(TIdSNMP(NULL));
        clientSnmp->Host           = hostTarget;
        clientSnmp->Community      = "public";
        clientSnmp->ReceiveTimeout = 6000;

        clientSnmp->Query->PDUType = PDUGetRequest;
        clientSnmp->Query->MIBAdd(sysDescr, "");
        clientSnmp->Query->MIBAdd(sysUpTime, "");

        if (clientSnmp->SendQuery())
        {
            int cnt = clientSnmp->Reply->ValueCount;
            if (cnt > 0)
            {
                for (int idx = 0; idx < cnt; ++idx)
                {
                    String s1 = clientSnmp->Reply->ValueOID[idx];
                    String s2 = clientSnmp->Reply->Value[idx];
                    Mylog(Format("Query on [%s] : [%s] => [%s]", ARRAYOFCONST((hostTarget, s1, s2))));
                }
            }
            else
            {
                Mylog("*** No anwser *** ");
            }
        }
        else
        {
            Mylog("*** Query not sent *** ");
        }
    }
    catch (const Exception & ex)
    {
        Mylog(Format("ERROR [%s] ", ARRAYOFCONST((ex.Message))));
    }
}

如果您重载Mylog()以接受可变数量的参数,则可以稍微简化日志记录:

void __fastcall TForm1::Mylog(const String &Msg)
{
    // use Msg as needed ...
}

void __fastcall TForm1::Mylog(const String &Msg, const TVarRec *Args, int Args_High)
{
    Mylog(Format(Msg, Args, Args_High));
}

void __fastcall TForm1::LabelSimpleSnmpCallClick(TObject * Sender)
{
    String hostTarget = Edit_SnmpServer->Text;
    String sysDescr = "1.3.6.1.2.1.1.1.0";
    String sysUpTime = "1.3.6.1.2.1.1.3.0";

    Mylog("Test simple SNMP call on server [%s]", ARRAYOFCONST((hostTarget)));
    try
    {
        std::auto_ptr<TIdSNMP> clientSnmp(TIdSNMP(NULL));
        clientSnmp->Host           = hostTarget;
        clientSnmp->Community      = "public";
        clientSnmp->ReceiveTimeout = 6000;

        clientSnmp->Query->PDUType = PDUGetRequest;
        clientSnmp->Query->MIBAdd(sysDescr, "");
        clientSnmp->Query->MIBAdd(sysUpTime, "");

        if (clientSnmp->SendQuery())
        {
            int cnt = clientSnmp->Reply->ValueCount;
            if (cnt > 0)
            {
                for (int idx = 0; idx < cnt; ++idx)
                {
                    String s1 = clientSnmp->Reply->ValueOID[idx];
                    String s2 = clientSnmp->Reply->Value[idx];
                    Mylog("Query on [%s] : [%s] => [%s]", ARRAYOFCONST((hostTarget, s1, s2)));
                }
            }
            else
            {
                Mylog("*** No anwser *** ");
            }
        }
        else
        {
            Mylog("*** Query not sent *** ");
        }
    }
    catch (const Exception & ex)
    {
        Mylog("ERROR [%s] ", ARRAYOFCONST((ex.Message)));
    }
}

如果您切换到String::vprintf()then Format(),您可以进一步简化日志记录:

void __cdecl TForm1::Mylog(const PChar MsgFmt, ...)
{
    String Msg;

    va_list args;
    va_start(args, MsgFmt);
    Msg.vprintf(MsgFmt, args);
    va_end(args);

    // use Msg as needed...
}

void __fastcall TForm1::LabelSimpleSnmpCallClick(TObject * Sender)
{
    String hostTarget = Edit_SnmpServer->Text;
    String sysDescr = "1.3.6.1.2.1.1.1.0";
    String sysUpTime = "1.3.6.1.2.1.1.3.0";

    Mylog("Test simple SNMP call on server [%s]", hostTarget.c_str());
    try
    {
        std::auto_ptr<TIdSNMP> clientSnmp(TIdSNMP(NULL));
        clientSnmp->Host           = hostTarget;
        clientSnmp->Community      = "public";
        clientSnmp->ReceiveTimeout = 6000;

        clientSnmp->Query->PDUType = PDUGetRequest;
        clientSnmp->Query->MIBAdd(sysDescr, "");
        clientSnmp->Query->MIBAdd(sysUpTime, "");

        if (clientSnmp->SendQuery())
        {
            int cnt = clientSnmp->Reply->ValueCount;
            if (cnt > 0)
            {
                for (int idx = 0; idx < cnt; ++idx)
                {
                    String s1 = clientSnmp->Reply->ValueOID[idx];
                    String s2 = clientSnmp->Reply->Value[idx];
                    Mylog("Query on [%s] : [%s] => [%s]", hostTarget.c_str(), s1.c_str(), s2.c_str());
                }
            }
            else
            {
                Mylog("*** No anwser *** ");
            }
        }
        else
        {
            Mylog("*** Query not sent *** ");
        }
    }
    catch (const Exception & ex)
    {
        Mylog("ERROR [%s] ", ex.Message.c_str());
    }
}
于 2012-08-08T17:42:21.070 回答