请高手解决局域网所有snmp代理的发现问题
我的目的是利用winsnmp来发现局域网中所有的代理机器,不过对他们的消息机制不是很明白,请高手解答一下。
我的方法是这样的:
1。先定义一个消息:#define wMsgDis WM_USER+1000
2.对这个消息关联一个函数,当电脑收到这个消息时应该会自动调用这个函数:ON_MESSAGE(wMsgDis,DiscoverAgents)
3.定义几个函数:void CSnmpManagerDlg::OnStartsnmp() //这是开始寻找代理
{
if(pSnmp.sessionID==FALSE)
{
pSnmp.CreateSession(CSnmpManagerDlg::m_hWnd,wMsgDis);
pSnmp.sessionID=TRUE;
}
pSnmp.CreateVbl("1.3.6.1.2.1.4.20.1.1",NULL);//1.3.6.1.2.1.4.20.1.1是ipAdEntAddr的oid
pSnmp.CreatePdu(SNMP_PDU_GETNEXT,NULL,NULL,NULL);
pSnmp.Send("255.255.255.255","public");
m_bNext=TRUE;
}
对DiscoverAgents函数的定义,有消息是自动调用:
void CSnmpManagerDlg::DiscoverAgents()
{
CString strIp;
pSnmp.Receive(m_sOid,m_value);
for(int i=1;i<=pSnmp.nCount;i++)
{
if(m_value[i]->syntax==SNMP_SYNTAX_IPADDR)
{
strIp.Format("%d",*m_value[i]->value.string.ptr);
strIp+=".";
strTemp.Format("%d",*(m_value[i]->value.string.ptr+1));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_value[i]->value.string.ptr+2));
strIp+=strTemp;
strIp+=".";
strTemp.Format("%d",*(m_value[i]->value.string.ptr+3));
strIp+=strTemp;
strcpy(str[i],strIp);
CListBox* pList=(CListBox *)GetDlgItem(IDC_LIST1);
pList->AddString(strIp);//把得到的ip地址加到listbox里显示
}
}
if(m_bNext==TRUE)
AgentNext(m_sOid[1]);
}
然后是对AgentNext函数的定义,我觉得应该是相当于genext吧:
void CSnmpManagerDlg::AgentNext(LPTSTR Oid)
{
CString str(Oid);
static i=0;
if(!strcmp(str.Left(20),"1.3.6.1.2.1.4.20.1.1"))
{
m_OidNext[i]=new char[50];
m_valueNext[i]=new char[50];
strcpy(m_OidNext[i],m_sOid[1]);
strcpy(m_valueNext[i],CSnmpManagerDlg::str[1]);
pSnmp.CreateVbl(Oid,NULL);
pSnmp.CreatePdu(SNMP_PDU_GETNEXT,NULL,NULL,NULL);
pSnmp.Send("255.255.255.255","public");
i++;
}
else
{
m_bNext=TRUE;
}
}
通过OnStartsnmp函数,我向广播地址发送消息,所有安装了snmp代理的机器应该都给我回复一个消息,当我的机器收到这个消息时,应该能自动调用DiscoverAgents(),然后用AgentNext应该就可以发现目标的ip地址了,我通过这种方法能发现一些,但不是所有的代理地址,请高人帮我解答一下,谢谢了