www.pudn.com > SNMP_vc.rar > MonitorDlg.cpp


// MonitorDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Monitor.h" 
#include "MonitorDlg.h" 
#include "Input.h" 
#include  
#include  
 
#pragma comment(lib,"mgmtapi") 
#pragma comment(lib,"snmpapi") 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define TIMEOUT 6000 /* milliseconds */ 
#define RETRIES 3 
 
#define USER_EXEC_SNMP	(WM_USER+1) 
#define USER_START_TRAP	(WM_USER+2) 
#define USER_STOP_TRAP	(WM_USER+3) 
#define USER_START_STAT (WM_USER+4) 
#define USER_STOP_STAT	(WM_USER+5) 
 
struct ThreadParam{ 
	CString		agent; 
	CString		comm; 
	CMonitorDlg* pDlg; 
}; 
 
CWinThread * pThread = NULL;	//trap thread 
CWinThread * pThread2 = NULL;	//statistic thread 
CMonitorDlg * pDlg = NULL; 
///////////////////////////////////////////////////////////////////////////// 
UINT SnmpTrap(LPVOID param); 
UINT SnmpStat(LPVOID param); 
BOOL AsnPrint(AsnAny* any, CString& strbuf, BOOL bShowType=TRUE); 
 
//transfer unsigned long var to IP address string 
CString  ul2addr(ULONG l) 
{ 
	unsigned char* pch = (unsigned char*)&l; 
	CString str; 
	str.Format("%hu.%hu.%hu.%hu",(unsigned short)*(pch),(unsigned short)*(pch+1), 
		(unsigned short)*(pch+2),(unsigned short)*(pch+3)); 
	return str; 
} 
 
//dump memery data as octet string 
CString dumpOctStr(void * buf, int len) 
{ 
	ASSERT(buf && len>0); 
	CString str = _T(""); 
	unsigned char *psh = (unsigned char*)buf; 
	char pch[4] = {'\0'}; 
	int ret = 0; 
 
	while (len--) { 
		ret = sprintf(pch,"%02X ",(UINT)*psh); 
		pch[ret] = '\0'; 
		psh++; 
		str = pch + str; 
	} 
	return str; 
} 
 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX}; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMonitorDlg dialog 
 
CMonitorDlg::CMonitorDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CMonitorDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CMonitorDlg) 
	m_strOid = _T(""); 
	m_strAgentComm = _T(""); 
	m_nIntervalTime = 2; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_bEnableTrap = FALSE; 
	m_nRadioIndex = WALK; 
	m_strAgentComm = "public"; 
	m_strOid = "1.1.0"; 
	nItem = -1; 
	nSubItem = -1; 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CMonitorDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CMonitorDlg) 
	DDX_Control(pDX, IDC_SPIN1, m_CtrlSpin); 
	DDX_Control(pDX, IDC_CtrlList, m_CtrlList); 
	DDX_Control(pDX, IDC_Interface, m_CtrlInterface); 
	DDX_Control(pDX, IDC_AgentIP, m_CtrlAgentIP); 
	DDX_Control(pDX, IDC_MibTree, m_CtrlMibTree); 
	DDX_Text(pDX, IDC_Oid, m_strOid); 
	DDX_Text(pDX, IDC_AgentComm, m_strAgentComm); 
	DDX_Text(pDX, IDC_IntervalTime, m_nIntervalTime); 
	DDV_MinMaxUInt(pDX, m_nIntervalTime, 1, 60); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CMonitorDlg, CDialog) 
	//{{AFX_MSG_MAP(CMonitorDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_Exec, OnExec) 
	ON_BN_CLICKED(IDC_SnmpGet, OnSnmpGet) 
	ON_BN_CLICKED(IDC_SnmpGetNext, OnSnmpGetNext) 
	ON_BN_CLICKED(IDC_SnmpSet, OnSnmpSet) 
	ON_BN_CLICKED(IDC_SnmpWalk, OnSnmpWalk) 
	ON_BN_CLICKED(IDC_SnmpTrap, OnSnmpTrap) 
	ON_NOTIFY(NM_DBLCLK, IDC_MibTree, OnDblclkMibTree) 
	ON_NOTIFY(NM_CLICK, IDC_MibTree, OnClickMibTree) 
	ON_BN_CLICKED(IDC_StatStart, OnStatStart) 
	ON_NOTIFY(NM_RCLICK, IDC_CtrlList, OnRclickCtrlList) 
	ON_BN_CLICKED(IDC_AddOid, OnAddOid) 
	ON_NOTIFY(NM_CLICK, IDC_CtrlList, OnClickCtrlList) 
	ON_LBN_SETFOCUS(IDC_Interface, OnSetfocusInterface) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMonitorDlg message handlers 
 
BOOL CMonitorDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
	 
	// Add "About..." menu item to system menu. 
	HTREEITEM	current; 
	int i;	 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
	 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	/************************************************************************/ 
	/* initialize mib-2 trees			                                    */ 
	/************************************************************************/ 
	m_CtrlMibTree.InsertItem("mib-2"); 
	current = m_CtrlMibTree.GetRootItem(); 
	m_CtrlMibTree.InsertItem("1 system",current); 
	m_CtrlMibTree.InsertItem("2 interface",current); 
	m_CtrlMibTree.InsertItem("3 at",current); 
	m_CtrlMibTree.InsertItem("4 ip",current); 
	m_CtrlMibTree.InsertItem("5 icmp",current); 
	m_CtrlMibTree.InsertItem("6 tcp",current); 
	m_CtrlMibTree.InsertItem("7 udp",current); 
	m_CtrlMibTree.InsertItem("8 egp",current); 
	m_CtrlMibTree.InsertItem("9 comt",current); 
	m_CtrlMibTree.InsertItem("10 transmission",current); 
	m_CtrlMibTree.InsertItem("11 snmp",current); 
		current = m_CtrlMibTree.GetChildItem(current); 
		m_CtrlMibTree.InsertItem("1 sysDescr",current); 
		m_CtrlMibTree.InsertItem("2 sysObjectID",current); 
		m_CtrlMibTree.InsertItem("3 sysUpTime",current); 
		m_CtrlMibTree.InsertItem("4 sysContact",current); 
		m_CtrlMibTree.InsertItem("5 sysName",current); 
		m_CtrlMibTree.InsertItem("6 sysLocation",current); 
		m_CtrlMibTree.InsertItem("7 sysServices",current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current); 
		m_CtrlMibTree.InsertItem("1 ifNumber",current); 
		m_CtrlMibTree.InsertItem("2 ifTable",current); 
			current = m_CtrlMibTree.GetChildItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 ifEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 ifIndex",current); 
				m_CtrlMibTree.InsertItem("2 ifDescr",current); 
				m_CtrlMibTree.InsertItem("3 ifType",current); 
				m_CtrlMibTree.InsertItem("4 ifMtu",current); 
				m_CtrlMibTree.InsertItem("5 ifSpeed",current); 
				m_CtrlMibTree.InsertItem("6 ifPhysAddress",current); 
				m_CtrlMibTree.InsertItem("7 ifAdminStatus",current); 
				m_CtrlMibTree.InsertItem("8 ifOperStatus",current); 
				m_CtrlMibTree.InsertItem("9 ifLastChange",current); 
				m_CtrlMibTree.InsertItem("10 ifInOctets",current); 
				m_CtrlMibTree.InsertItem("11 ifInUcastPkts",current); 
				m_CtrlMibTree.InsertItem("12 ifInNUcastPkts",current); 
				m_CtrlMibTree.InsertItem("13 ifInDiscards",current); 
				m_CtrlMibTree.InsertItem("14 ifInErrors",current); 
				m_CtrlMibTree.InsertItem("15 ifInUnknownProtos",current); 
				m_CtrlMibTree.InsertItem("16 ifOutOctets",current); 
				m_CtrlMibTree.InsertItem("17 ifOutUcastPkts",current); 
				m_CtrlMibTree.InsertItem("18 ifOutNUcastPkts",current); 
				m_CtrlMibTree.InsertItem("19 ifOutDiscards",current); 
				m_CtrlMibTree.InsertItem("20 ifOutErrors",current); 
				m_CtrlMibTree.InsertItem("21 ifOutQLen",current); 
				m_CtrlMibTree.InsertItem("22 ifSpecific",current); 
				current = m_CtrlMibTree.GetParentItem(current); 
			current = m_CtrlMibTree.GetParentItem(current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current); 
		m_CtrlMibTree.InsertItem("0 Empty",current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current); 
		m_CtrlMibTree.InsertItem("1 ipForwarding",current); 
		m_CtrlMibTree.InsertItem("2 ipDefaultTTL",current); 
		m_CtrlMibTree.InsertItem("3 ipInReceives",current); 
		m_CtrlMibTree.InsertItem("4 ipInHdrErrors",current); 
		m_CtrlMibTree.InsertItem("5 ipInAddrErrors",current); 
		m_CtrlMibTree.InsertItem("6 ipForwDatagrams",current); 
		m_CtrlMibTree.InsertItem("7 ipInUnknownProtocs",current); 
		m_CtrlMibTree.InsertItem("8 ipInDiscards",current); 
		m_CtrlMibTree.InsertItem("9 ipInDelivers",current); 
		m_CtrlMibTree.InsertItem("10 ipOutRequests",current); 
		m_CtrlMibTree.InsertItem("11 ipOutDiscards",current); 
		m_CtrlMibTree.InsertItem("12 ipOutNoRoutes",current); 
		m_CtrlMibTree.InsertItem("13 ipReasmTimeout",current); 
		m_CtrlMibTree.InsertItem("14 ipReasmReqds",current); 
		m_CtrlMibTree.InsertItem("15 ipReasmOKs",current); 
		m_CtrlMibTree.InsertItem("16 ipReasmFails",current); 
		m_CtrlMibTree.InsertItem("17 ipFragOKs",current); 
		m_CtrlMibTree.InsertItem("18 ipFragFails",current); 
		m_CtrlMibTree.InsertItem("19 ipFragCreates",current); 
		m_CtrlMibTree.InsertItem("20 ipAddrTable",current); 
		m_CtrlMibTree.InsertItem("21 ipRouteTable",current); 
		m_CtrlMibTree.InsertItem("22 ipNetToMediaTable",current); 
		m_CtrlMibTree.InsertItem("23 ipRoutingDiscards",current); 
		m_CtrlMibTree.InsertItem("24 ipForward",current); 
			current = m_CtrlMibTree.GetChildItem(current); 
			for (i=0; i<17; i++) { 
				current = m_CtrlMibTree.GetNextSiblingItem(current); 
			} 
			m_CtrlMibTree.InsertItem("1 ipAddrEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 ipAdEntAddr",current); 
				m_CtrlMibTree.InsertItem("2 ipAdEntIfIndex",current); 
				m_CtrlMibTree.InsertItem("3 ipAdEntNetMask",current); 
				m_CtrlMibTree.InsertItem("4 ipAdEntBcastAddr",current); 
				m_CtrlMibTree.InsertItem("5 ipAdEntReasmMaxSize",current); 
			current = m_CtrlMibTree.GetParentItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 ipRouteEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 ipRouteDest",current); 
				m_CtrlMibTree.InsertItem("2 ipRouteIfIndex",current); 
				m_CtrlMibTree.InsertItem("3 ipRouteMetric1",current); 
				m_CtrlMibTree.InsertItem("4 ipRouteMetric2",current); 
				m_CtrlMibTree.InsertItem("5 ipRouteMetric3",current); 
				m_CtrlMibTree.InsertItem("6 ipRouteMetric4",current); 
				m_CtrlMibTree.InsertItem("7 ipRouteNextHop",current); 
				m_CtrlMibTree.InsertItem("8 ipRouteType",current); 
				m_CtrlMibTree.InsertItem("9 ipRouteProto",current); 
				m_CtrlMibTree.InsertItem("10 ipRouteAge",current); 
				m_CtrlMibTree.InsertItem("11 ipRouteMask",current); 
				m_CtrlMibTree.InsertItem("12 ipRouteMetric5",current); 
				m_CtrlMibTree.InsertItem("13 ipRouteInfo",current); 
			current = m_CtrlMibTree.GetParentItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 ipNetToMediaEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 ipNetToMediaIfIndex",current); 
				m_CtrlMibTree.InsertItem("2 ipNetToMediaPhysAddress",current); 
				m_CtrlMibTree.InsertItem("3 ipNetToMediaNetAddress",current); 
				m_CtrlMibTree.InsertItem("4 ipNetToMediaType",current); 
			current = m_CtrlMibTree.GetParentItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 ipForwardNumber",current); 
			m_CtrlMibTree.InsertItem("2 ipForwardTable",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				current = m_CtrlMibTree.GetNextSiblingItem(current); 
				m_CtrlMibTree.InsertItem("1 ipForwardEntry",current); 
					current = m_CtrlMibTree.GetChildItem(current); 
					m_CtrlMibTree.InsertItem("1 ipForwardDest",current); 
					m_CtrlMibTree.InsertItem("2 ipForwardMask",current); 
					m_CtrlMibTree.InsertItem("3 ipForwardPolicy",current); 
					m_CtrlMibTree.InsertItem("4 ipForwardNextHop",current); 
					m_CtrlMibTree.InsertItem("5 ipForwardIfIndex",current); 
					m_CtrlMibTree.InsertItem("6 ipForwardType",current); 
					m_CtrlMibTree.InsertItem("7 ipForwardProto",current); 
					m_CtrlMibTree.InsertItem("8 ipForwardAge",current); 
					m_CtrlMibTree.InsertItem("9 ipForwardInfo",current); 
					m_CtrlMibTree.InsertItem("10 ipForwardNextHopAS",current); 
					m_CtrlMibTree.InsertItem("11 ipForwardMetric1",current); 
					m_CtrlMibTree.InsertItem("12 ipForwardMetric2",current); 
					m_CtrlMibTree.InsertItem("13 ipForwardMetric3",current); 
					m_CtrlMibTree.InsertItem("14 ipForwardMetric4",current); 
					m_CtrlMibTree.InsertItem("15 ipForwardMetric5",current); 
				current = m_CtrlMibTree.GetParentItem(current);//inForwardTable 
			current = m_CtrlMibTree.GetParentItem(current);//ipForward 
		current = m_CtrlMibTree.GetParentItem(current);//ip 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//icmp 
		m_CtrlMibTree.InsertItem("1 icmpInMsgs",current); 
		m_CtrlMibTree.InsertItem("2 icmpInErrors",current); 
		m_CtrlMibTree.InsertItem("3 icmpInDestUnreachs",current); 
		m_CtrlMibTree.InsertItem("4 icmpInTimeExcds",current); 
		m_CtrlMibTree.InsertItem("5 icmpInParmProbs",current); 
		m_CtrlMibTree.InsertItem("6 icmpInSrcQuenchs",current); 
		m_CtrlMibTree.InsertItem("7 icmpInRedirects",current); 
		m_CtrlMibTree.InsertItem("8 icmpInEchos",current); 
		m_CtrlMibTree.InsertItem("9 icmpInEchoReps",current); 
		m_CtrlMibTree.InsertItem("10 icmpInTimestamps",current); 
		m_CtrlMibTree.InsertItem("11 icmpInTimestampReps",current); 
		m_CtrlMibTree.InsertItem("12 icmpInAddrMasks",current); 
		m_CtrlMibTree.InsertItem("13 icmpInAddrMaskReps",current); 
		m_CtrlMibTree.InsertItem("14 icmpOutMsgs",current); 
		m_CtrlMibTree.InsertItem("15 icmpOutErrors",current); 
		m_CtrlMibTree.InsertItem("16 icmpOutDestUnreachs",current); 
		m_CtrlMibTree.InsertItem("17 icmpOutTimeExcds",current); 
		m_CtrlMibTree.InsertItem("18 icmpOutParmProbs",current); 
		m_CtrlMibTree.InsertItem("19 icmpOutSrcQuenchs",current); 
		m_CtrlMibTree.InsertItem("20 icmpOutRedirects",current); 
		m_CtrlMibTree.InsertItem("21 icmpOutEchos",current); 
		m_CtrlMibTree.InsertItem("22 icmpOutEchoReps",current); 
		m_CtrlMibTree.InsertItem("23 icmpOutTimestamps",current); 
		m_CtrlMibTree.InsertItem("24 icmpOutTimestampReps",current); 
		m_CtrlMibTree.InsertItem("25 icmpOutAddrMasks",current); 
		m_CtrlMibTree.InsertItem("26 icmpOutAddrMaskReps",current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//tcp 
		m_CtrlMibTree.InsertItem("1 tcpRtoAlgorithms",current); 
		m_CtrlMibTree.InsertItem("2 tcpRtoMin",current); 
		m_CtrlMibTree.InsertItem("3 tcpRtoMax",current); 
		m_CtrlMibTree.InsertItem("4 tcpMaxConn",current); 
		m_CtrlMibTree.InsertItem("5 tcpActiveOpens",current); 
		m_CtrlMibTree.InsertItem("6 tcpPassiveOpens",current); 
		m_CtrlMibTree.InsertItem("7 tcpAttemptFails",current); 
		m_CtrlMibTree.InsertItem("8 tcpEstabResets",current); 
		m_CtrlMibTree.InsertItem("9 tcpCurrEstab",current); 
		m_CtrlMibTree.InsertItem("10 tcpInSegs",current); 
		m_CtrlMibTree.InsertItem("11 tcpOutSegs",current); 
		m_CtrlMibTree.InsertItem("12 tcpRetransSegs",current); 
		m_CtrlMibTree.InsertItem("13 tcpConnTable",current); 
		m_CtrlMibTree.InsertItem("14 tcpInErrs",current); 
		m_CtrlMibTree.InsertItem("15 tcpOutRsts",current); 
			current = m_CtrlMibTree.GetChildItem(current); 
			for (i = 0; i<12; i++) { 
				current = m_CtrlMibTree.GetNextSiblingItem(current); 
			} 
			m_CtrlMibTree.InsertItem("1 tcpConnEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 tcpConnState",current); 
				m_CtrlMibTree.InsertItem("2 tcpConnLocalAddress",current); 
				m_CtrlMibTree.InsertItem("3 tcpConnLocalPort",current); 
				m_CtrlMibTree.InsertItem("4 tcpConnRemAddress",current); 
				m_CtrlMibTree.InsertItem("5 tcpConnRemPort",current); 
			current = m_CtrlMibTree.GetParentItem(current);//tcpConnTable 
		current = m_CtrlMibTree.GetParentItem(current);//tcp 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//udp 
		m_CtrlMibTree.InsertItem("1 udpInDatagrams",current); 
		m_CtrlMibTree.InsertItem("2 udpNoPorts",current); 
		m_CtrlMibTree.InsertItem("3 udpInErrors",current); 
		m_CtrlMibTree.InsertItem("4 udpOutDatagrams",current); 
		m_CtrlMibTree.InsertItem("5 udpTable",current); 
			current = m_CtrlMibTree.GetChildItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 udpEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 udpLocalAddress",current); 
				m_CtrlMibTree.InsertItem("2 udpLocalPort",current); 
			current = m_CtrlMibTree.GetParentItem(current);//udpTable 
		current = m_CtrlMibTree.GetParentItem(current);//udp 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//egp 
		m_CtrlMibTree.InsertItem("1 egpInMsgs",current); 
		m_CtrlMibTree.InsertItem("2 egpInErrors",current); 
		m_CtrlMibTree.InsertItem("3 egpOutMessages",current); 
		m_CtrlMibTree.InsertItem("4 egpOutErrors",current); 
		m_CtrlMibTree.InsertItem("5 egpNeighTable",current); 
		m_CtrlMibTree.InsertItem("6 egpAs",current); 
			current = m_CtrlMibTree.GetChildItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			current = m_CtrlMibTree.GetNextSiblingItem(current); 
			m_CtrlMibTree.InsertItem("1 egpNeighEntry",current); 
				current = m_CtrlMibTree.GetChildItem(current); 
				m_CtrlMibTree.InsertItem("1 egpNeighState",current); 
				m_CtrlMibTree.InsertItem("2 egpNeighAddr",current); 
				m_CtrlMibTree.InsertItem("3 egpNeighAs",current); 
				m_CtrlMibTree.InsertItem("4 egpNeighInMsgs",current); 
				m_CtrlMibTree.InsertItem("5 egpNeighInErrs",current);	 
				m_CtrlMibTree.InsertItem("6 egpNeighOutMsgs",current); 
				m_CtrlMibTree.InsertItem("7 egpNeighOutErrs",current); 
				m_CtrlMibTree.InsertItem("8 egpNeighInErrMsgs",current); 
				m_CtrlMibTree.InsertItem("9 egpNeighOutErrMsgs",current); 
				m_CtrlMibTree.InsertItem("10 egpNeighStateUps",current); 
				m_CtrlMibTree.InsertItem("11 egpNeighStateDowns",current); 
				m_CtrlMibTree.InsertItem("12 egpNeighIntervalHello",current); 
				m_CtrlMibTree.InsertItem("13 egpNeighIntervalPoll",current); 
				m_CtrlMibTree.InsertItem("14 egpNeighMode",current); 
				m_CtrlMibTree.InsertItem("15 egpNeighEventTrigger",current); 
			current = m_CtrlMibTree.GetParentItem(current);//egpNeighTable 
		current = m_CtrlMibTree.GetParentItem(current);//egp 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//CMOT 
		m_CtrlMibTree.InsertItem("0 Reserved for OSI",current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//transmission 
		m_CtrlMibTree.InsertItem("0 not used in this program)",current); 
		current = m_CtrlMibTree.GetNextSiblingItem(current);//snmp 
		m_CtrlMibTree.InsertItem("1 snmpInPkts",current); 
		m_CtrlMibTree.InsertItem("2 snmpOutPkts",current); 
		m_CtrlMibTree.InsertItem("3 snmpInBadVersions",current); 
		m_CtrlMibTree.InsertItem("4 snmpInBadCommunityNames",current); 
		m_CtrlMibTree.InsertItem("5 snmpInBadCommunityUses",current); 
		m_CtrlMibTree.InsertItem("6 snmpInASNParseErrs",current); 
		m_CtrlMibTree.InsertItem("7 is not used",current); 
		m_CtrlMibTree.InsertItem("8 snmpInTooBigs",current); 
		m_CtrlMibTree.InsertItem("9 snmpInNoSuchNames",current); 
		m_CtrlMibTree.InsertItem("10 snmpInBadValues",current); 
		m_CtrlMibTree.InsertItem("11 snmpInReadOnlys",current); 
		m_CtrlMibTree.InsertItem("12 snmpInGenErrs",current); 
		m_CtrlMibTree.InsertItem("13 snmpInTotalReqVars",current); 
		m_CtrlMibTree.InsertItem("14 snmpInTotalSetVars",current); 
		m_CtrlMibTree.InsertItem("15 snmpInGetRequests",current); 
		m_CtrlMibTree.InsertItem("16 snmpInGetNexts",current); 
		m_CtrlMibTree.InsertItem("17 snmpInSetRequests",current); 
		m_CtrlMibTree.InsertItem("18 snmpInGetResponses",current); 
		m_CtrlMibTree.InsertItem("19 snmpInTraps",current); 
		m_CtrlMibTree.InsertItem("20 snmpOutTooBigs",current); 
		m_CtrlMibTree.InsertItem("21 snmpOutNoSuchNames",current); 
		m_CtrlMibTree.InsertItem("22 snmpOutBadValues",current); 
		m_CtrlMibTree.InsertItem("23 is not used",current); 
		//m_CtrlMibTree.InsertItem("snmpInReadOnlys",current); 
		m_CtrlMibTree.InsertItem("24 snmpOutGenErrs",current); 
		m_CtrlMibTree.InsertItem("25 snmpOutGetRequests",current); 
		m_CtrlMibTree.InsertItem("26 snmpOutGetNexts",current); 
		m_CtrlMibTree.InsertItem("27 snmpOutSetRequests",current); 
		m_CtrlMibTree.InsertItem("28 snmpOutGetResponses",current); 
		m_CtrlMibTree.InsertItem("29 snmpOutTraps",current); 
		m_CtrlMibTree.InsertItem("30 snmpEnableAuthenTraps",current); 
		 
	m_CtrlMibTree.SelectItem(m_CtrlMibTree.GetRootItem()); 
	m_CtrlAgentIP.SetWindowText("127.0.0.1"); 
	m_CtrlList.InsertColumn(0,"OID"); 
	m_CtrlList.InsertColumn(1,"Type(Value)"); 
	m_CtrlList.SetColumnWidth(0,160); 
	m_CtrlList.SetColumnWidth(1,300); 
	m_CtrlSpin.SetBuddy((CWnd*)GetDlgItem(IDC_IntervalTime)); 
	m_CtrlSpin.SetRange(1,60); 
	((CButton*)GetDlgItem(IDC_SnmpWalk))->SetCheck(1); 
	pDlg = this; 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CMonitorDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CMonitorDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CMonitorDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
LRESULT CMonitorDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	switch(message) { 
	case USER_EXEC_SNMP: 
		if(!SnmpQuery()){ 
			AfxMessageBox("Snmp Query Failure"); 
		} 
		SetDlgItemText(IDC_Status,"Snmp Query Success"); 
		break; 
	case USER_START_TRAP: 
		pThread = AfxBeginThread(SnmpTrap,NULL); 
		break; 
	case USER_STOP_TRAP: 
		if(pThread){ 
			pThread->ExitInstance(); 
		} 
		pThread = NULL; 
		AfxMessageBox("Trap Server Was Stopped "); 
		break; 
	case USER_START_STAT: 
		pThread2 = AfxBeginThread(SnmpStat,NULL); 
		//AfxMessageBox("Stat Started"); 
		break; 
	case USER_STOP_STAT: 
		if (pThread2){ 
			pThread2->ExitInstance(); 
		} 
		pThread2 = NULL; 
		SetDlgItemText(IDC_Status,"Statistics Thread Was Stoped"); 
		break; 
	default: 
		break; 
	} 
	return CDialog::DefWindowProc(message, wParam, lParam); 
} 
 
void CMonitorDlg::OnExec()  
{ 
	// TODO: Add your control notification handler code here 
	if (CheckParams()) { 
		PostMessage(USER_EXEC_SNMP); 
	}else{ 
		AfxMessageBox("Wrong Parameters"); 
	} 
	 
} 
 
BOOL CMonitorDlg::SnmpQuery() 
{ 
	CString              agent; 
	CString              community; 
	RFC1157VarBindList variableBindings; 
	LPSNMP_MGR_SESSION	session; 
	AsnObjectIdentifier reqObject; 
	INT        timeout = TIMEOUT; 
	INT        retries = RETRIES; 
 
	BYTE       requestType; 
	AsnInteger errorStatus; 
	AsnInteger errorIndex; 
	char        *chkPtr = NULL; 
	CString		errMsg; 
	int			index; 
 
	UpdateData(TRUE); 
	 
	//get mib data 
	switch(m_nRadioIndex) { 
	case GET: 
		if(m_strOid.Find(".0")==-1){ 
			m_strOid += ".0"; 
		} 
		requestType = ASN_RFC1157_GETREQUEST; 
		break; 
	case WALK: 
		index = m_strOid.Find(".0"); 
		if(index!=-1){ 
			m_strOid.Delete(index,2); 
		} 
		requestType = ASN_RFC1157_GETNEXTREQUEST; 
		break; 
	case GETNEXT: 
		if(m_strOid.Find(".0")==-1){ 
			m_strOid += ".0"; 
		} 
		requestType = ASN_RFC1157_GETNEXTREQUEST; 
		break; 
	case SET: 
		requestType = ASN_RFC1157_SETREQUEST; 
		break; 
	default: 
		AfxMessageBox("wrong index of radio buttons"); 
		break; 
	} 
	UpdateData(FALSE); 
 
	m_CtrlList.DeleteAllItems(); 
	m_CtrlList.SetColumnWidth(0,160); 
	m_CtrlList.SetColumnWidth(1,300); 
	m_CtrlAgentIP.GetWindowText(agent); 
	community = m_strAgentComm; 
	variableBindings.len = 0; 
	variableBindings.list = NULL; 
	SetDlgItemText(IDC_Status,""); 
	if (!SnmpMgrStrToOid(m_strOid.GetBuffer(0), &reqObject)){ 
		AfxMessageBox("Unknown Object Identifier"); 
		return FALSE; 
	}else{ 
		// Since sucessfull, add to the variable bindings list. 
		variableBindings.len++; 
		if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc(variableBindings.list, 
			sizeof(RFC1157VarBind))) == NULL){ 
			AfxMessageBox("Error: Error allocating oid "+m_strOid); 
			return FALSE; 
		} 
		variableBindings.list[variableBindings.len - 1].name = reqObject; // NOTE!  structure copy 
		variableBindings.list[variableBindings.len - 1].value.asnType = ASN_NULL;		 
	} 
 
	//start snmp session 
	if((session=SnmpMgrOpen(agent.GetBuffer(0),community.GetBuffer(0),timeout,retries))==NULL){ 
		errMsg.Format("Error: On SnmpMgrOpen [%d]",GetLastError()); 
		AfxMessageBox(errMsg); 
		return FALSE; 
	} 
	 
	 
	//send snmp request and deal with response 
	if (m_nRadioIndex==GET || m_nRadioIndex==GETNEXT) { 
		if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex))	{ 
		// The API is indicating an error. 
			errMsg.Format("error on SnmpMgrRequest %d\n", GetLastError()); 
			AfxMessageBox(errMsg); 
			return FALSE; 
		}else{ 
		// The API succeeded, errors may be indicated from the remote agent. 
			if (errorStatus > 0){ 
				errMsg.Format("Error: errorStatus=%d, errorIndex=%d\n",errorStatus, errorIndex); 
				AfxMessageBox(errMsg); 
				//return FALSE; 
			}else{ 
				// Display the resulting variable bindings. 
				char *string = NULL; 
				 
				for(unsigned int i=0; i < variableBindings.len; i++){ 
					m_CtrlList.InsertItem(0,NULL); 
					SnmpMgrOidToStr(&variableBindings.list[i].name, &string); 
					errMsg.Format("%s", string); 
					m_CtrlList.SetItemText(0,0,errMsg); 
					 
					if (string){ 
						SNMP_free(string); 
					} 
					//SnmpUtilPrintAsnAny(&variableBindings.list[i].value); 
					AsnPrint(&variableBindings.list[i].value, errMsg); 
					m_CtrlList.SetItemText(0,1,errMsg); 
				} // end for()				 
			} 
		} 
		// Free the variable bindings that have been allocated. 
		SnmpUtilVarBindListFree(&variableBindings); 
	}else if (m_nRadioIndex == WALK) { 
        // Walk is a common term used to indicate that all MIB variables 
        // under a given OID are to be traversed and displayed.  This is 
        // a more complex operation requiring tests and looping in addition 
        // to the steps for get/getnext above. 
        AsnObjectIdentifier root; 
        AsnObjectIdentifier tempOid; 
 
		SnmpUtilOidCpy(&root, &variableBindings.list[0].name); 
        		 
        while(TRUE){ 
            if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) { 
                // The API is indicating an error. 
                errMsg.Format("error on SnmpMgrRequest %d", GetLastError()); 
				AfxMessageBox(errMsg); 
                break; 
            }else { 
                // The API succeeded, errors may be indicated from the remote 
                // agent. 
                // Test for end of subtree or end of MIB. 
				 
                if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME || 
                    SnmpUtilOidNCmp(&variableBindings.list[0].name,&root, root.idLength)) { 
						errMsg.Format("End of MIB subtree."); 
						m_CtrlList.InsertItem(0,NULL); 
						m_CtrlList.SetItemText(0,0,errMsg); 
						break; 
                } 
                // Test for general error conditions or sucesss. 
                if (errorStatus > 0) { 
                    errMsg.Format("Error: errorStatus=%d, errorIndex=%d \n",errorStatus, errorIndex); 
					AfxMessageBox(errMsg); 
                    break; 
                }else{ 
                    // Display resulting variable binding for this iteration. 
                    char *string = NULL; 
					m_CtrlList.InsertItem(0,NULL); 
                    SnmpMgrOidToStr(&variableBindings.list[0].name, &string); 
                    errMsg.Format("%s", string); 
					m_CtrlList.SetItemText(0,0,errMsg); 
					 
                    if (string){ 
						SNMP_free(string); 
					} 
                    //SnmpUtilPrintAsnAny(&variableBindings.list[0].value); 
					AsnPrint(&variableBindings.list[0].value,errMsg); 
					m_CtrlList.SetItemText(0,1,errMsg); 
                } 
           } // end if() 
            // Prepare for the next iteration.  Make sure returned oid is 
            // preserved and the returned value is freed. 
            SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name); 
            SnmpUtilVarBindFree(&variableBindings.list[0]); 
            SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid); 
            variableBindings.list[0].value.asnType = ASN_NULL; 
            SnmpUtilOidFree(&tempOid); 
		} // end while() 
        // Free the variable bindings that have been allocated. 
        SnmpUtilVarBindListFree(&variableBindings); 
        SnmpUtilOidFree(&root); 
    }else if(m_nRadioIndex == SET){ 
		 
	/************************************************************************/ 
	/* get the oid and value here                                        */ 
		CInput m_DlgInput; 
		char * stopstring; 
		AsnOctetString asnstr; 
		m_DlgInput.m_strOID = m_strOid; 
		if(m_DlgInput.DoModal()==IDCANCEL){ 
			return TRUE; 
		} 
		 
		switch(m_DlgInput.m_nTypeIndex)	{ 
		case 0:	//ASN_INTEGER 
			variableBindings.list[0].value.asnType = ASN_INTEGER; 
			variableBindings.list[0].value.asnValue.number = atoi(m_DlgInput.m_strVal.GetBuffer(0)); 
			break; 
		case 1: //ASN_INTEGER32 
			variableBindings.list[0].value.asnType = ASN_INTEGER32; 
			variableBindings.list[0].value.asnValue.number = atoi(m_DlgInput.m_strVal.GetBuffer(0)); 
			break; 
		case 2:	//ASN_UNSIGNED32 
			variableBindings.list[0].value.asnType = ASN_UNSIGNED32; 
			variableBindings.list[0].value.asnValue.unsigned32 = strtoul(m_DlgInput.m_strVal.GetBuffer(0),&stopstring,10); 
			break; 
		case 3:	//ASN_COUNTER64 
			variableBindings.list[0].value.asnType = ASN_COUNTER64; 
			//maybe use bcmath lib is better 
			variableBindings.list[0].value.asnValue.counter64.QuadPart = _atoi64(m_DlgInput.m_strVal.GetBuffer(0)); 
			break; 
		case 4:	//ASN_OCTETSTRING			 
			asnstr.dynamic = TRUE; 
			asnstr.length = m_DlgInput.m_strVal.GetLength(); 
			asnstr.stream = (BYTE*)SNMP_malloc(asnstr.length); 
			memcpy(&asnstr,m_DlgInput.m_strVal.GetBuffer(0),m_DlgInput.m_strVal.GetLength()); 
			variableBindings.list[0].value.asnType = ASN_OCTETSTRING; 
			SnmpUtilOctetsCpy(&variableBindings.list[0].value.asnValue.string,&asnstr);			 
			SnmpUtilOctetsFree(&asnstr); 
			break; 
		case 5: //ASN_BITS 
			variableBindings.list[0].value.asnType = ASN_BITS; 
			AfxMessageBox("ASN_BITS not supported yet"); 
			return FALSE; 
			break; 
		case 6:	//ASN_OBJECTIDENTIFIER 
			variableBindings.list[0].value.asnType = ASN_OBJECTIDENTIFIER; 
			AfxMessageBox("ASN_OBJECTIDENTIFIER not supported yet"); 
			return FALSE; 
			break; 
		case 7:	//ASN_SEQUENCE 
			variableBindings.list[0].value.asnType = ASN_SEQUENCE; 
			AfxMessageBox("ASN_SEQUENCE not supported yet"); 
			return FALSE; 
			break; 
		case 8:	//ASN_IPADDRESS 
			variableBindings.list[0].value.asnType = ASN_IPADDRESS; 
			AfxMessageBox("ASN_IPADDRESS not supported yet"); 
			return FALSE; 
			break; 
		case 9:	//ASN_COUNTER32 
			variableBindings.list[0].value.asnType = ASN_COUNTER32; 
			variableBindings.list[0].value.asnValue.counter = strtoul(m_DlgInput.m_strVal.GetBuffer(0), 
				&stopstring,10); 
			break; 
		case 10://ASN_GAUGE32 
			variableBindings.list[0].value.asnType = ASN_GAUGE32; 
			variableBindings.list[0].value.asnValue.gauge = strtoul(m_DlgInput.m_strVal.GetBuffer(0), 
				&stopstring,10); 
			break; 
		case 11://ASN_TIMETICKS 
			variableBindings.list[0].value.asnType = ASN_TIMETICKS; 
			variableBindings.list[0].value.asnValue.ticks = strtoul(m_DlgInput.m_strVal.GetBuffer(0), 
				&stopstring,10); 
			break; 
		case 12://ASN_OPAQUE 
			variableBindings.list[0].value.asnType = ASN_OPAQUE; 
			asnstr.dynamic = TRUE; 
			asnstr.length = m_DlgInput.m_strVal.GetLength(); 
			asnstr.stream = (BYTE*)SNMP_malloc(asnstr.length); 
			memcpy(&asnstr,m_DlgInput.m_strVal.GetBuffer(0),m_DlgInput.m_strVal.GetLength()); 
			SnmpUtilOctetsCpy(&variableBindings.list[0].value.asnValue.arbitrary,&asnstr);			 
			SnmpUtilOctetsFree(&asnstr); 
			break; 
		default: 
			AfxMessageBox("unknown ASN value type"); 
			return FALSE; 
		} 
 
		if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)) { 
                // The API is indicating an error. 
			errMsg.Format("error on SnmpMgrRequest %d", GetLastError()); 
			AfxMessageBox(errMsg);  
        }else{ 
			if (errorStatus > 0){ 
				errMsg.Format("Error: errorStatus=%d, errorIndex=%d\n",errorStatus, errorIndex); 
				AfxMessageBox(errMsg); 
				return FALSE; 
			}else{ 
				SetDlgItemText(IDC_Status,"SNMP Set-Request OK"); 
			}			 
        } 
    } 
	if (!SnmpMgrClose(session)) { 
		errMsg.Format("Close SNMP Session Failed. Error : %d",GetLastError()); 
		AfxMessageBox(errMsg); 
	} 
 
	return TRUE; 
} 
 
void CMonitorDlg::OnSnmpGet() 
{ 
	// TODO: Add your control notification handler code here 
	m_nRadioIndex = GET; 
} 
 
void CMonitorDlg::OnSnmpGetNext()  
{ 
	// TODO: Add your control notification handler code here 
	m_nRadioIndex = GETNEXT; 
} 
 
void CMonitorDlg::OnSnmpSet()  
{ 
	// TODO: Add your control notification handler code here 
	m_nRadioIndex = SET; 
} 
 
void CMonitorDlg::OnSnmpWalk() 
{ 
	// TODO: Add your control notification handler code here 
	m_nRadioIndex = WALK;	 
} 
 
void CMonitorDlg::OnSnmpTrap()  
{ 
	// TODO: Add your control notification handler code here 
	if(m_bEnableTrap){ 
		if(AfxMessageBox("Are you sure to stop trap server?",MB_OKCANCEL)==IDCANCEL){ 
			((CButton*)GetDlgItem(IDC_SnmpTrap))->SetCheck(1); 
			return; 
		} 
		m_bEnableTrap = FALSE; 
		PostMessage(USER_STOP_TRAP); 
	}else{ 
		m_bEnableTrap = TRUE; 
		PostMessage(USER_START_TRAP); 
	} 
} 
 
BOOL CMonitorDlg::CheckParams() 
{ 
	CString Agent; 
	 
	UpdateData(TRUE); 
	m_CtrlAgentIP.GetWindowText(Agent); 
	if (Agent.IsEmpty()) { 
		AfxMessageBox("No Agent IP Address"); 
		return FALSE; 
	} 
	if (m_strAgentComm.IsEmpty()) { 
		AfxMessageBox("No Agent Community, try 'public' as default"); 
		return FALSE; 
	} 
	if(m_strOid.IsEmpty()){ 
		AfxMessageBox("No Object Identifier Specified"); 
	} 
	return TRUE; 
} 
 
/************************************************************************/ 
/* 
typedef struct { 
    BYTE asnType; 
     union { 
       AsnInteger32         number;      // ASN_INTEGER 
                                         // ASN_INTEGER32 
       AsnUnsigned32        unsigned32;  // ASN_UNSIGNED32 
       AsnCounter64         counter64;   // ASN_COUNTER64 
       AsnOctetString       string;      // ASN_OCTETSTRING 
       AsnBits              bits;        // ASN_BITS 
       AsnObjectIdentifier  object;      // ASN_OBJECTIDENTIFIER 
       AsnSequence          sequence;    // ASN_SEQUENCE 
       AsnIPAddress         address;     // ASN_IPADDRESS 
       AsnCounter32         counter;     // ASN_COUNTER32 
       AsnGauge32           gauge;       // ASN_GAUGE32 
       AsnTimeticks         ticks;       // ASN_TIMETICKS 
       AsnOpaque            arbitrary;   // ASN_OPAQUE 
} asnValue; 
} AsnAny; 
 
asnType  
Indicates the variable's type. This member must be only one of the following values. Value Meaning  
ASN_INTEGER				Indicates a 32-bit signed integer variable.   
ASN_INTEGER32			Indicates a 32-bit signed integer variable.   
ASN_UNSIGNED32			Indicates a 32-bit unsigned integer variable.   
ASN_COUNTER64			Indicates a counter variable that increases until it reaches a maximum value of (2^64) – 1.   
ASN_OCTETSTRING			Indicates an octet string variable.  
ASN_BITS				Indicates a variable that is an enumeration of named bits.   
ASN_OBJECTIDENTIFIER	Indicates an object identifier variable.   
ASN_SEQUENCE			Indicates an ASN sequence variable.  
ASN_IPADDRESS			Indicates an IP address variable.  
ASN_COUNTER32			Indicates a counter variable.  
ASN_GAUGE32				Indicates a gauge variable.  
ASN_TIMETICKS			Indicates a timeticks variable.  
ASN_OPAQUE				Indicates an opaque variable.  
 
asnValue  
Contains the variable's value. This member can be only one of the following values. Value Meaning  
number			Accesses a 32-bit signed integer variable.   
unsigned32		Accesses a 32-bit unsigned integer variable.   
counter64		Accesses a counter variable that increases until it reaches a maximum value of (2^64) – 1.   
string			Accesses an octet string variable.   
bits			Accesses a variable that is an enumeration of named bits with non-negative, contiguous values, starting at zero.   
object			Accesses an object identifier variable.   
sequence		Accesses an ASN sequence variable.   
address			Accesses an IP address variable.   
counter			Accesses a counter variable that increases until it reaches a maximum value of (2^32) – 1.   
gauge			Accesses a gauge variable.   
ticks			Accesses a timeticks counter variable that is relative to a specific timer event.   
arbitrary		Accesses an opaque variable.   
 
*/ 
/************************************************************************/ 
 
 
BOOL AsnPrint(AsnAny* any, CString& strbuf, BOOL bShowType) 
{ 
	ASSERT(any); 
	char * string = NULL; 
	if (bShowType) { 
		switch(any->asnType) { 
			case ASN_INTEGER:			//Indicates a 32-bit signed integer variable.  									 
				strbuf.Format("ASN_INTEGER32( %d )", any->asnValue.number); 
				break; 
			case ASN_UNSIGNED32:		//Indicates a 32-bit unsigned integer variable.   
				strbuf.Format("ASN_UNSIGNED32( %u )", any->asnValue.unsigned32); 
				break; 
			case ASN_COUNTER64:			//Indicates a counter variable that increases  
										//until it reaches a maximum value of (2^64) – 1.   
				strbuf.Format("ASN_COUNTER64( %I64u )",any->asnValue.counter64); 
				break; 
			case ASN_OCTETSTRING:		//Indicates an octet string variable.  
				strbuf.Format("ASN_OCTETSTRING( %s )",any->asnValue.string.stream);			 
				break; 
			case ASN_BITS:				//Indicates a variable that is an enumeration of named bits.   
				strbuf = "ASN_BITS( " +  
					dumpOctStr((void*)any->asnValue.bits.stream,any->asnValue.bits.length)+" )"; 
				break; 
			case ASN_OBJECTIDENTIFIER:	//Indicates an object identifier variable.   
				SnmpMgrOidToStr(&(any->asnValue.object), &string); 
				strbuf.Format("ASN_OBJECTIDENTIFIER( %s )",string); 
				if(string){ 
					SNMP_free(string); 
				} 
				break; 
			case ASN_SEQUENCE:			//Indicates an ASN sequence variable. 
				strbuf.Format("ASN_SEQUENCE( %s )",any->asnValue.sequence.stream); 
				break; 
			case ASN_IPADDRESS:			//Indicates an IP address variable.  
				strbuf = "ASN_IPADDRESS( " + ul2addr(*((ULONG*)(any->asnValue.address.stream))) + " )"; 
				break; 
			case ASN_COUNTER32:			//Indicates a counter variable.  
				strbuf.Format("ASN_COUNTER32( %u )",any->asnValue.counter); 
				break; 
			case ASN_GAUGE32:			//Indicates a gauge variable.  
				strbuf.Format("ASN_GAUGE32( %u )",any->asnValue.gauge); 
				break; 
			case ASN_TIMETICKS:			//Indicates a timeticks variable.  
				strbuf.Format("ASN_TIMETICKS( %u )",any->asnValue.ticks); 
				break; 
			case ASN_OPAQUE:			//Indicates an opaque variable.  
				//treated as octstring 
				strbuf = "ASN_OPAQUE( " + dumpOctStr((void*)any->asnValue.arbitrary.stream, 
					any->asnValue.arbitrary.length) + " )"; 
				break; 
			default: 
				strbuf = _T("unknown value type"); 
				return FALSE; 
		} 
	}else{ 
		switch(any->asnType) { 
			case ASN_INTEGER:			//Indicates a 32-bit signed integer variable.  									 
				strbuf.Format("%d", any->asnValue.number); 
				break; 
			case ASN_UNSIGNED32:		//Indicates a 32-bit unsigned integer variable.   
				strbuf.Format("%u", any->asnValue.unsigned32); 
				break; 
			case ASN_COUNTER64:			//Indicates a counter variable that increases  
										//until it reaches a maximum value of (2^64) – 1.   
				strbuf.Format("%I64u",any->asnValue.counter64); 
				break; 
			case ASN_OCTETSTRING:		//Indicates an octet string variable.  
				strbuf.Format("%s",any->asnValue.string.stream);			 
				break; 
			case ASN_BITS:				//Indicates a variable that is an enumeration of named bits.   
				strbuf = dumpOctStr((void*)any->asnValue.bits.stream, 
					any->asnValue.bits.length); 
				break; 
			case ASN_OBJECTIDENTIFIER:	//Indicates an object identifier variable.   
				SnmpMgrOidToStr(&(any->asnValue.object), &string); 
				strbuf.Format("%s",string); 
				if(string){ 
					SNMP_free(string); 
				} 
				break; 
			case ASN_SEQUENCE:			//Indicates an ASN sequence variable. 
				strbuf.Format("%s",any->asnValue.sequence.stream); 
				break; 
			case ASN_IPADDRESS:			//Indicates an IP address variable.  
				strbuf = ul2addr(*((ULONG*)(any->asnValue.address.stream))); 
				break; 
			case ASN_COUNTER32:			//Indicates a counter variable.  
				strbuf.Format("%u",any->asnValue.counter); 
				break; 
			case ASN_GAUGE32:			//Indicates a gauge variable.  
				strbuf.Format("%u",any->asnValue.gauge); 
				break; 
			case ASN_TIMETICKS:			//Indicates a timeticks variable.  
				strbuf.Format("%u",any->asnValue.ticks); 
				break; 
			case ASN_OPAQUE:			//Indicates an opaque variable.  
				//treated as octstring 
				strbuf = dumpOctStr((void*)any->asnValue.arbitrary.stream, 
					any->asnValue.arbitrary.length); 
				break; 
			default: 
				strbuf = _T("unknown value type"); 
				return FALSE; 
		} 
	} 
	 
	return TRUE; 
} 
 
UINT SnmpTrap(LPVOID param) 
{ 
    // Trap handling can be done two different ways: event driven or 
    // polled.  The following code illustrates the steps to use event 
    // driven trap reception in a management application. 
	CString errMsg; 
    HANDLE hNewTraps = NULL; 
 
    if (!SnmpMgrTrapListen(&hNewTraps)){ 
        errMsg.Format("error on SnmpMgrTrapListen %d\n", GetLastError()); 
	}else{ 
        errMsg.Format("TrapServer Started"); 
	} 
	AfxMessageBox(errMsg); 
 
    while(TRUE){ 
        DWORD dwResult; 
        if ((dwResult = WaitForSingleObject(hNewTraps, 0xffffffff))== 0xffffffff){ 
            errMsg.Format("error on WaitForSingleObject %d\n",GetLastError()); 
			AfxMessageBox(errMsg); 
			return 0; 
		}else if (!ResetEvent(hNewTraps)){ 
            errMsg.Format("error on ResetEvent %d\n", GetLastError()); 
			AfxMessageBox(errMsg); 
			return 0; 
		}else{ 
            AsnObjectIdentifier enterprise; 
            AsnNetworkAddress   IPAddress; 
            AsnInteger          genericTrap; 
            AsnInteger          specificTrap; 
            AsnTimeticks        timeStamp; 
            RFC1157VarBindList  variableBindings; 
 
            UINT i; 
            char *string = NULL; 
 
            while(SnmpMgrGetTrap(&enterprise, &IPAddress, &genericTrap, 
                                 &specificTrap, &timeStamp, &variableBindings)){                 
                errMsg.Format("Trap Server : generic=%d specific=%d\n", 
                       genericTrap, specificTrap); 
				AfxMessageBox(errMsg); 
                if (IPAddress.length == 4) { 
                    errMsg.Format("  from -> %d.%d.%d.%d\n", 
                         (int)IPAddress.stream[0], (int)IPAddress.stream[1], 
                         (int)IPAddress.stream[2], (int)IPAddress.stream[3]); 
					AfxMessageBox(errMsg); 
 
                } 
                if (IPAddress.dynamic) { 
                    SNMP_free(IPAddress.stream); 
                } 
                for(i=0; i < variableBindings.len; i++){ 
                    SnmpMgrOidToStr(&variableBindings.list[i].name, &string); 
                    errMsg.Format("Variable = %s\n", string); 
					AfxMessageBox(errMsg); 
                    if (string){ 
						SNMP_free(string); 
					} 
	                //SnmpUtilPrintAsnAny(&variableBindings.list[i].value);					 
					AsnPrint(&variableBindings.list[i].value,errMsg); 
					AfxMessageBox("Value = "+errMsg); 
                } // end for() 
                SnmpUtilOidFree(&enterprise); 
                SnmpUtilVarBindListFree(&variableBindings); 
            } 
        } 
    } // end while() 
	return 1; 
} 
 
BOOL CMonitorDlg::DestroyWindow()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if (pThread) { 
		pThread->ExitInstance(); 
	} 
	if (pThread2) { 
		pThread2->ExitInstance(); 
	} 
	return CDialog::DestroyWindow(); 
} 
 
void CMonitorDlg::OnDblclkMibTree(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	CString		text, oid; 
	HTREEITEM selected,root; 
	UINT		ID; 
	BOOL		Dot = FALSE; 
	 
	root = m_CtrlMibTree.GetRootItem(); 
	selected = m_CtrlMibTree.GetSelectedItem(); 
	m_strOid = _T(""); 
	while (root!=selected) { 
		text = m_CtrlMibTree.GetItemText(selected); 
		sscanf(text.GetBuffer(0),"%u",&ID); 
		oid.Format("%u.",ID); 
		m_strOid = oid + m_strOid; 
		selected = m_CtrlMibTree.GetParentItem(selected); 
	} 
	m_strOid += "0"; 
	UpdateData(FALSE); 
	*pResult = 0; 
} 
 
void CMonitorDlg::OnClickMibTree(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	CString		text, oid; 
	HTREEITEM	selected,root; 
	UINT		ID; 
	BOOL		Dot = FALSE; 
	 
	root = m_CtrlMibTree.GetRootItem(); 
	selected = m_CtrlMibTree.GetSelectedItem(); 
	m_strOid = _T(""); 
	while (root!=selected) { 
		text = m_CtrlMibTree.GetItemText(selected); 
		sscanf(text.GetBuffer(0),"%u",&ID); 
		oid.Format("%u.",ID);		 
		m_strOid = oid + m_strOid; 
		 
		selected = m_CtrlMibTree.GetParentItem(selected); 
	} 
	m_strOid += "0"; 
	UpdateData(FALSE); 
 
	*pResult = 0; 
} 
 
void CMonitorDlg::OnStatStart()  
{ 
	// TODO: Add your control notification handler code here 
	CButton* pb = (CButton*)GetDlgItem(IDC_StatStart); 
	ASSERT(pb); 
 
	if (pb->GetCheck()) { 
		if(!m_CtrlInterface.GetCount()){ 
			m_strOid = _T("2"); 
			UpdateData(FALSE); 
			((CButton*)GetDlgItem(IDC_SnmpWalk))->SetCheck(1); 
			m_nRadioIndex = WALK; 
			((CButton*)GetDlgItem(IDC_AddOid))->EnableWindow(TRUE); 
			OnExec(); 
			AfxMessageBox("请先在上面的列表中选择要统计的OID"); 
			pb->SetCheck(0); 
			return; 
		} 
		//m_CtrlInterface.InsertString(0,"system.sysUpTime.0"); 
		PostMessage(USER_START_STAT); 
	}else{ 
		PostMessage(USER_STOP_STAT); 
		m_CtrlInterface.ResetContent(); 
		((CButton*)GetDlgItem(IDC_AddOid))->EnableWindow(FALSE); 
	} 
} 
 
UINT SnmpStat(LPVOID param) 
{ 
	int nitem = 0; 
	UINT				interval = 5; 
	CString             agent; 
	CString             community; 
	CString				strOid; 
	RFC1157VarBindList variableBindings; 
	LPSNMP_MGR_SESSION	session; 
	AsnObjectIdentifier reqObject; 
	INT        timeout = TIMEOUT; 
	INT        retries = RETRIES; 
	BYTE       requestType; 
	AsnInteger errorStatus; 
	AsnInteger errorIndex; 
	char        *chkPtr = NULL; 
	CString		errMsg; 
	CString		strRel = _T(""); 
	CFile		file; 
	CFileDialog fdlg(FALSE); 
	 
	if (fdlg.DoModal()!=IDOK ) { 
		AfxMessageBox("operation canceled"); 
		pThread2 = NULL; 
		((CButton*)pDlg->GetDlgItem(IDC_StatStart))->SetCheck(0); 
		AfxEndThread(EXIT_SUCCESS); 
	} 
	 
	pDlg->m_CtrlAgentIP.GetWindowText(agent); 
	community = pDlg->m_strAgentComm; 
	requestType = ASN_RFC1157_GETREQUEST; 
	 
	pDlg->SetDlgItemText(IDC_Status,"Statistics Thread Started"); 
	while (TRUE) { 
		//pDlg->m_CtrlInterface.ResetContent(); 
		strRel = _T(""); 
		//start snmp session 
		if((session=SnmpMgrOpen(agent.GetBuffer(0),community.GetBuffer(0),timeout,retries))==NULL){ 
			errMsg.Format("Error: On SnmpMgrOpen [%d] in SnmpStat()",GetLastError()); 
			AfxMessageBox(errMsg); 
			pThread2 = NULL; 
			AfxEndThread(EXIT_SUCCESS); 
		} 
		 
		nitem = pDlg->m_CtrlInterface.GetCount(); 
		if (nitem<1) { 
			errMsg.Format("nitem = %d",nitem); 
			AfxMessageBox(errMsg); 
		} 
		for (int i=0; im_CtrlInterface.GetText(i,strOid); 
			strRel += strOid + "\n"; 
			if(!SnmpMgrStrToOid(strOid.GetBuffer(0), &reqObject)){ 
				AfxMessageBox("Unknown Object Identifier : SnmpStat()"); 
				break; 
			}else{ 
			// Since sucessfull, add to the variable bindings list. 
				variableBindings.len = 1; 
				variableBindings.list = NULL; 
				if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc( 
					variableBindings.list,sizeof(RFC1157VarBind))) == NULL){ 
					AfxMessageBox("Error: Error allocating oid "+strOid); 
					break; 
				} 
				variableBindings.list[0].name = reqObject; // NOTE!  structure copy 
				variableBindings.list[0].value.asnType = ASN_NULL; 
			} 
			 
			if (!SnmpMgrRequest(session, requestType, &variableBindings,&errorStatus, &errorIndex)){ 
				// The API is indicating an error. 
				errMsg.Format("error on SnmpMgrRequest %d in SnmpStat()", GetLastError()); 
				AfxMessageBox(errMsg); 
				break; 
			}else{ 
				// The API succeeded, errors may be indicated from the remote agent. 
				if (errorStatus > 0){ 
					errMsg.Format("Error: errorStatus=%d, errorIndex=%d\n",errorStatus, errorIndex); 
					AfxMessageBox(errMsg); 
				}else{ 
					// Display the resulting variable bindings. 
					AsnPrint(&variableBindings.list[0].value,errMsg,FALSE); 
					if (variableBindings.list[0].value.asnType==ASN_OCTETSTRING || 
						variableBindings.list[0].value.asnType==ASN_SEQUENCE) { 
						errMsg.Replace('\n','_'); 
						errMsg.Replace('\t','_'); 
						errMsg.Replace(' ', '_'); 
					}					 
					strRel += errMsg + "\n"; 
				} 
			} 
			SnmpUtilVarBindListFree(&variableBindings); 
		}//end of for		 
		SnmpMgrClose(session);		 
		file.Open(fdlg.GetPathName(),CFile::shareDenyWrite | CFile::modeCreate | CFile::modeWrite); 
		file.Write(strRel.GetBuffer(0),(UINT)strRel.GetLength()); 
		file.Close(); 
		//AfxMessageBox(strRel); 
		interval = pDlg->GetDlgItemInt(IDC_IntervalTime); 
		interval = (interval>0 && interval<=60)?interval:5; 
		Sleep(60000*interval); 
	} 
	 
	return 0; 
} 
 
void CMonitorDlg::OnRclickCtrlList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	 
	*pResult = 0; 
} 
 
void CMonitorDlg::OnAddOid()  
{ 
	// TODO: Add your control notification handler code here 
	CString		str; 
	UINT	index = m_CtrlInterface.GetCurSel(); 
 
	GetDlgItemText(IDC_AddOid,str); 
	if (str=="添加OID") { 
		str = m_CtrlList.GetItemText(nItem,0); 
		if (m_CtrlInterface.FindString(-1,str)==LB_ERR) { 
			if(index<0){ 
				m_CtrlInterface.AddString(str); 
			}else{ 
				m_CtrlInterface.InsertString(index+1,str); 
			} 
			 
		}else{ 
			AfxMessageBox("已经添加过了"); 
		} 
	}else{ 
		if (m_CtrlInterface.GetCurSel()<0) { 
			AfxMessageBox("请在下面表中先选中要删除的OID"); 
		}else{ 
			m_CtrlInterface.DeleteString(m_CtrlInterface.GetCurSel()); 
		} 
	} 
} 
 
void CMonitorDlg::OnClickCtrlList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	NMLISTVIEW* plv = (NMLISTVIEW*)pNMHDR; 
	CString errMsg; 
 
	nItem = plv->iItem; 
	nSubItem = plv->iSubItem; 
	if (nItem<0) { 
		((CButton*)GetDlgItem(IDC_AddOid))->EnableWindow(FALSE); 
		return; 
	} 
	((CButton*)GetDlgItem(IDC_AddOid))->EnableWindow(TRUE); 
	SetDlgItemText(IDC_AddOid,"添加OID"); 
	*pResult = 0; 
} 
 
void CMonitorDlg::OnSetfocusInterface()  
{ 
	// TODO: Add your control notification handler code here 
	SetDlgItemText(IDC_AddOid,"删除OID"); 
}