【问题标题】:Snmp agent implementation in c++ builder plus indyc++ builder和indy中的Snmp代理实现
【发布时间】:2015-06-26 06:01:24
【问题描述】:

我有一个使用 Indy 组件进行 TCP 通信的 c++ 应用程序。 现在我需要实现 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 获取请求 1.3.6.1.2.1.1.3.0

但是当idSnmp->SendTrap()wireshark 什么都看不到 (wireshark 的过滤器在这两种情况下都是 UDP 端口范围 161-162)

我很高兴看到一些关于我的代码的评论,或者可能是 SendTrap 的工作示例 :)

【问题讨论】:

    标签: c++builder snmp indy


    【解决方案1】:

    Indy 没有 SNMP 服务器组件。要允许应用从您的应用请求 SNMP 值,您必须实现自己的 SNMP 服务器,例如使用TIdUDPServer 及其OnUDPRead 事件,然后手动解析 SNMP 请求。

    另一种选择是让外部应用程序向您的应用程序注册自己,然后您的应用程序可以在需要时使用TIdSNMP.SendTrap() 将状态更新推送到已注册的应用程序。

    【讨论】:

      【解决方案2】:

      看起来您根本没有看到陷阱离开您的主机。我看到这是不久前的事了,但这对我有用……稍微解释一下我的代码:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2010-09-13
        • 1970-01-01
        相关资源
        最近更新 更多