e ServerSocket !");
}
else
AfxMessageBox("Can not new ServerSocket !");
}
void CChatDlg::Send(BOOL ToServer, unsigned char* buf, int buf_len)
{
if(ToServer)
{
if(pServerSocket != NULL)
{
if(pServerSocket->SendTo(buf, buf_len, SNMP_SOCKET_PORT, m_ServerAddress)==SOCKET_ERROR)
AfxMessageBox("Error: fail to send data to server !");
}
}
else
{
if(pClientSocket != NULL)
{
if(pClientSocket->SendTo(buf, buf_len, m_ClientPort, m_ClientAddress)==SOCKET_ERROR)
AfxMessageBox("Error: fail to send data to client !");
}
}
}
注意:m_ServerAddress是交换机的IP地址,要事先在CChatDlg的OnInitDialog函数或其他地方设定。
最后,要处理接收到的来自于交换机的UDP包,将其中的数据在Output窗口中按每行10个的格式显示出来,然后调用CChatDlg的Send函数将其转发给网管
程序。这在CServerSocket类的OnReceive虚函数中实现:
void CServerSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
unsigned char tmp[MAXTMPSIZE];
int i;
int RecNum;
RecNum = Receive(tmp, MAXTMPSIZE);
if(RecNum > 0)
{
TRACE("Received from server, %d bytes:\n", RecNum);
for(i=0; i<RecNum; i++)
{
if(i%10==0)
TRACE("\n%5d,", tmp[i]);
else
TRACE("%5d,", tmp[i]);
}
TRACE("\n\n");
pDlg->Send(false, tmp, RecNum);
}
else
{
i = GetLastError();
TRACE("RecNum = %d, GetLastError() = %d\n", RecNum, i);
AfxMessageBox("Error: fail to Receive from server!");
}
}
以上就是本程序的主要功能部分,其中有一些变量因篇幅原因未作详细解释,但不影响对
程序的理解。
三, 运行过程
分别在两台机器上装上本程序和网管程序,将它们连上交换机,先运行本程序,点Listen按钮,然后运行网管程序。一般的网管程序运行时,需要设置被管设备的IP的地址,此时,要将其设为本程序所在机器的IP地址,使网管程序将所有的SNMP包发给本
程序。
之后两程序应能正确运行(如果不行,可能要将上述过程多重复几次。),在Output窗口可以看到数据源源不断地显示出来,这真是对网管过程的真实记录!当数据量足够后,结束本程序,可以看到网管程序界面上显示出“设备已断开连接!”的提示信息。然后可以将Output窗口中的数据拷贝到文本文件中,按照SNMP的格式和编码规则进行详细分析,网管协议就由此慢慢地破解出来了。
以上程序在Visual C++ 6.0下编译通过并运行成功,实践效果很好。