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; i m_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"); }