如何使用indy TidSNMP组件陷阱
我正在使用C++ builderXE与Indy 10.5.7,并试图从另一个代理snmp接收陷阱。如何使用indy TidSNMP组件陷阱
我没有介绍如何做接收陷阱的程序的信息。
下面你可以找到我正在尝试使用的代码片段。
ReceiveTrap()方法总是返回0,这意味着收到非数据。
我用几年前使用备用API制作的另一个程序测试了PC配置,并且收到了陷阱,所以我不这样做,它应该是配置问题。
你有一些帽子的建议我在例行下面错了吗? 最好的问候,恩佐
void __fastcall TForm1::LabelReceiveTrapClick(TObject * Sender)
{
static bool status = false;
int ists;
String Fun = "[SimpleReceiveTrap] ";
TSNMPInfo * infoSnmp = 0;
try
{
status = !status;
if (status)
{
std::auto_ptr<TIdSNMP>clientSnmp(new TIdSNMP(NULL));
clientSnmp->Community = "public";
clientSnmp->ReceiveTimeout = 1000;
clientSnmp->Binding->Port = 162;
while (status)
{
Application->ProcessMessages();
ists = clientSnmp->ReceiveTrap();
Mylog(L"%s ReceiveTrap status = [%d]", Fun.c_str(), ists);
if (ists > 0)
{
infoSnmp = clientSnmp->Trap;
}
}
}
}
catch (Exception & ex)
{
Mylog(L"%s ERROR", Fun.c_str(), ex.Message.c_str());
}
}
那是不是设置的监听端口接收陷阱的正确方法。读取Binding
属性使用TIdSNMP::BoundIP
和TIdSNMP::BoundPort
属性分配并将套接字绑定到本地IP /端口。您已经绑定后不能更改该套接字的本地Port
,因此您的Binding->Port
属性的分配实际上是无效的。
对于这个问题,无论如何你都试图操纵错误的插座。 Binding
套接字用于向远程SNMP系统发送查询。 TIdSNMP
使用一个单独的插座来接收陷阱。 TIdSNMP
具有单独的TrapPort
属性,用于指定该套接字的侦听端口。当访问Binding
时,陷阱套接字被分配并绑定到Binding->IP
和TIdSNMP::TrapPort
。该TrapPort
属性默认为162
std::auto_ptr<TIdSNMP>clientSnmp(new TIdSNMP(NULL));
clientSnmp->Community = "public";
clientSnmp->ReceiveTimeout = 1000;
clientSnmp->TrapPort = 162; // <--
...
ists = clientSnmp->ReceiveTrap();
看着Indy的更新日志,出现了一些陷阱相关更改监听套接字,因为10.5.7发布,所以你可能需要升级到一个新的印版获得错误修复。或者,您可以下载最新版本,然后直接将IdSNMP.pas
直接添加到您的项目中。
只使用悠组件我无法读取陷阱转2C 但我发现使用TWSocket和TSNMPInfo的解决方案,这似乎运作良好
Belowe我使用的代码:
要获得数据我用TWSocket来回FPiette组件套件:
void __fastcall TForm1::LabelStartServerTracSnmpClick(TObject * Sender)
{
String Fun = "[LabelStartServerTracSnmp] ";
try
{
if (WSocket1->State == wsClosed)
{
WSocket1->Proto = "udp";
WSocket1->Addr = "0.0.0.0";
WSocket1->Port = 162;
WSocket1->Listen();
}
else
{
WSocket1->Close();
}
}
catch (Exception & ex)
{
Mylog(L"%s ERROR: [%s]", Fun.c_str(), ex.Message.c_str());
}
}
分析接收到的数据我用的是印地
void __fastcall TForm1::WSocket1DataAvailable(TObject * Sender, WORD ErrCode)
{
char buffer[1024];
int len, cnt, srcLen;
TSockAddrIn srcSocket;
String rcvmsg, remHost, s1, s2, Fun = "[WSocket1DataAvailable] ";
TIdSNMP * clientSnmp = NULL;
TSNMPInfo * infoSnmp = NULL;
try
{
srcLen = sizeof(srcSocket);
len = WSocket1->ReceiveFrom(buffer, sizeof(buffer), srcSocket, srcLen);
if (len >= 0)
{
buffer[len] = 0;
rcvmsg = String(buffer, len);
__try
{
clientSnmp = new TIdSNMP(NULL);
infoSnmp = new TSNMPInfo(clientSnmp);
infoSnmp->DecodeBuf(rcvmsg);
cnt = infoSnmp->ValueCount;
if (cnt > 0)
{
// ---------------------------------------------------
for (int idx = 0; idx < cnt; ++idx)
{
s1 = infoSnmp->ValueOID[idx];
s2 = infoSnmp->Value[idx];
Mylog(L"[%s] Trap : [%s] => [%s]", s1.c_str(), s2.c_str());
}
}
}
__finally
{
if (infoSnmp)
{
delete infoSnmp;
infoSnmp = 0;
}
if (clientSnmp)
{
delete clientSnmp;
clientSnmp = 0;
}
}
}
}
catch (Exception & ex)
{
Mylog(L"%s ERROR", Fun.c_str(), ex.Message.c_str());
}
}