当前位置: 首页 > 知识库问答 >
问题:

在c builder plus indy中实现snmp代理

莘欣怿
2023-03-14

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

共有2个答案

阎德辉
2023-03-14

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

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

勾通
2023-03-14

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

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

 类似资料:
  • 我对SNMP代理实现有一些基本问题,其中一些问题可能也无效,但请让我知道 是否有任何方法可以从SNMP Manager中找到代理支持的SNMP版本

  • 我已使用snmp4j api在SNMP代理上创建,但SNMP表注册存在问题 一旦我注册了表和表中的行。然后,如果我在表中设置值,所有行都会设置相同的值。我已经从JSON创建了snmp表 如果我设置了值,请在下表中 .1.3.6.1.4.1.1.201.6.2。它为下表中注册的所有行设置值。是否有人知道如何使用snmmpj代理正确注册和设置值。

  • 我是SNMP新手,谢谢你的支持......我有一个子代理的现有Perl脚本,在尝试运行它时出现了以下问题:代理似乎连接到“默认”snmpd deamon,该deamon被配置为主代理(“master agentx”行存在于snmpd.conf中)。此时,脚本将一些值分配给我的MIB中的对象。但是,当我然后在master-agent上执行snmpwalk或snmpget时,我得到(对于v1查询)“结

  • 本文向大家介绍C#简单实现SNMP的方法,包括了C#简单实现SNMP的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#简单实现SNMP的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我正在尝试使用snmp4j模拟SNMP代理。我正在向代理注册MOs。下面是代码段: 当启动代理时,我得到了DuplicateInstrationException。请指导我如何注册类。请提供方向。

  • 我正在尝试用Java实现SNMP代理。我使用snmp4j库(http://www.snmp4j.org/)。当前,我的代理在localhost/4700上工作。由于以下请求,我尝试发送snmpget请求: 但我只得到类似“此OID当前不存在这样的实例”的信息。这是我的问题:我不知道如何创建一个实例。我试图在MOTable中添加行,但似乎不起作用。 下面是我实现MOGRoup的类的摘要 但是下面的请