深圳市芯络实业有限公司 chenjun
一, 开发目的及原理
本公司在产品开发过程中,需要研究多种以太网交换机(又称智能集线器)的内部网管信息结构,为此,必须编写出一个“窃听”程序,把网管程序和交换机的通讯内容记录下来加以分析。本人在Visual C++ 6.0下用MFC Socket类编出
程序,成功地实现了上述目的。
目前,标准的网络管理
程序与支持网管的网络设备之间大多采用标准的简单网络管理协议(SNMP)进行通讯。SNMP是一种高层协议,建立于UDP/IP之上。通讯双方按照SNMP格式来传递各种网管信息和控制信息,并能进行事件实时报告或报警,从而使网络管理员能方便及时地控制网络当前的运行情况。
网管信息的范围十分广泛,如网络流量,连接状态等,因被管设备的不同而不同,厂家也能依照有关的国际标准自定义自家产品的网管信息。网管信息集中定义于管理信息库(MIB)中,整个体系是一个可扩展的树状结构。一条条的网管信息被包装在SNMP协议包内,再往下传给传输层,转成UDP包,然后通过Socket 机制发送出去。
本程序的基本原理是:插到网管程序和被管设备之间“欺上瞒下”,与网管程序通讯时冒充被管设备;与被管设备通讯时冒充网管程序,使二者对本程序“无话不谈”;本
程序则暗中有序地记录下谈话内容,然后再“上传下达”,将收到的内容转发给真正的接收者,使谈话继续下去,如此循环不已。
二, 编程的思路和具体过程
本程序不需要复杂的图形界面,因此,只需用Project Wizard开出一个支持Socket而基于对话框的MFC 应用程序即可。对话框的类名为CChatDlg,然后再用资源编辑器在这个对话框上加上一个按钮,面上文字为“Listen”。接收到的所有信息将在Visual C++集成环境的Output窗口中用TRACE语句打出,这样做的目的是能方便及时地看到各种数据,当然也可用别的方法。在本程序中,Client指网管
程序,Server指交换机。
接着给本项目添加两个类,它们都衍生自CSocket,可调用ClassWizard工具生成。CClientSocket用于接收来自网管
程序的UDP数据,而CServerSocket则用于接收来自交换机的UDP数据。这两个类的定义如下:
class CClientSocket : public CSocket
{
// Attributes
public:
// Operations
public:
CClientSocket(CChatDlg* pdlg);
virtual ~CClientSocket();
// Overrides
public:
BOOL m_bFirst;
CChatDlg* pDlg;
// ClassWizard generated virtual
function overrides
//{{AFX_VIRTUAL(CClientSocket)
public:
virtual void OnReceive(int nErrorCode);
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CClientSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
// Implementation
protected:
};
m_bFirst和pDlg是自定义的两个类别成员, 其作用见下文。
class CServerSocket : public CSocket
{
// Attributes
public:
// Operations
public:
CServerSocket(CChatDlg* pdlg);
virtual ~CServerSocket();
// Overrides
public: CChatDlg* pDlg;
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CServerSocket)
public:
virtual void OnReceive(int nErrorCode);
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CServerSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
// Implementation
protected:
};
然后