MainFrm.cpp
上传用户:hbytqc8
上传日期:2014-07-31
资源大小:527k
文件大小:14k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "NetMap.h"
  5. #include "NetMapDoc.h"
  6. #include "MainFrm.h"
  7. #include "snmp_pp.h"
  8. #include "Show.h"
  9. #include "Modify.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMainFrame
  17. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  18. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  19. //{{AFX_MSG_MAP(CMainFrame)
  20. ON_WM_CREATE()
  21. ON_COMMAND(ID_SCAN, OnScan)
  22. ON_COMMAND(ID_GRAPH, OnGraph)
  23. ON_COMMAND(ID_SHOWINFORMATION, OnShowinformation)
  24. ON_COMMAND(ID_NODE_MODIFY, OnNodeModify)
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. static UINT indicators[] =
  28. {
  29. ID_SEPARATOR,           // status line indicator
  30. ID_INDICATOR_CAPS,
  31. ID_INDICATOR_NUM,
  32. ID_INDICATOR_SCRL,
  33. };
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CMainFrame construction/destruction
  36. CMainFrame::CMainFrame()
  37. {
  38. // TODO: add member initialization code here
  39. }
  40. CMainFrame::~CMainFrame()
  41. {
  42. }
  43. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  44. {
  45. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  46. return -1;
  47. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  48. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  49. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  50. {
  51. TRACE0("Failed to create toolbarn");
  52. return -1;      // fail to create
  53. }
  54. if (!m_wndStatusBar.Create(this) ||
  55. !m_wndStatusBar.SetIndicators(indicators,
  56.   sizeof(indicators)/sizeof(UINT)))
  57. {
  58. TRACE0("Failed to create status barn");
  59. return -1;      // fail to create
  60. }
  61. // TODO: Delete these three lines if you don't want the toolbar to
  62. //  be dockable
  63. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  64. EnableDocking(CBRS_ALIGN_ANY);
  65. DockControlBar(&m_wndToolBar);
  66. return 0;
  67. }
  68. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  69. {
  70. if( !CFrameWnd::PreCreateWindow(cs) )
  71. return FALSE;
  72. // TODO: Modify the Window class or styles here by modifying
  73. //  the CREATESTRUCT cs
  74. //cs.style=WS_MAXIMIZE;
  75. cs.x=4;
  76. cs.y=4;
  77.     cs.cx=800;
  78. cs.cy=750;
  79. return TRUE;
  80. }
  81. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  82. {
  83. BOOL Result=v.CreateStatic(this,1,2,WS_CHILD | WS_VISIBLE);
  84. ASSERT(Result);
  85. h.CreateStatic(&v,2,1,WS_CHILD | WS_VISIBLE,v.IdFromRowCol(0,1));
  86. v.CreateView(0,0,RUNTIME_CLASS(CMapView),CSize(237,100),pContext);
  87. h.CreateView(0,0,RUNTIME_CLASS(CNetMapView),CSize(400,400),pContext);
  88. h.CreateView(1,0,RUNTIME_CLASS(CVlanView),CSize(400,400),pContext);
  89. return Result;
  90. }
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CMainFrame diagnostics
  93. #ifdef _DEBUG
  94. void CMainFrame::AssertValid() const
  95. {
  96. CFrameWnd::AssertValid();
  97. }
  98. void CMainFrame::Dump(CDumpContext& dc) const
  99. {
  100. CFrameWnd::Dump(dc);
  101. }
  102. #endif //_DEBUG
  103. /////////////////////////////////////////////////////////////////////////////
  104. // CMainFrame message handlers
  105. //根据text属性查找特定的节点是否存在,如找到,返回符合条件节点的句柄,
  106. //否则返回NULL;
  107. HTREEITEM CMainFrame::FindNode(HTREEITEM hSubRoot,const CString &text)
  108. {
  109.     if (hSubRoot==NULL) 
  110. return NULL;
  111. //判断是否符合条件,如是,返回该节点的举柄;
  112.     if (pListView->m_map.GetItemText(hSubRoot)==text)
  113. return hSubRoot;
  114. hSubRoot=pListView->m_map.GetChildItem(hSubRoot);
  115. do 
  116. {
  117.        HTREEITEM ht;
  118.    //递归调用FindNode;
  119.    if ((ht=FindNode(hSubRoot,text)) !=NULL)
  120.    return ht;
  121. } while ((hSubRoot=pListView->m_map.GetNextSiblingItem(hSubRoot)) !=NULL);
  122.     return NULL;
  123. }
  124. bool CMainFrame::Findport(CString &port,NodeData *p)
  125. {
  126. for (int i=0;i<(p->m_neighbor.GetSize());i++)
  127. {
  128. if (p->m_neighbor.GetAt(i).localport==port)
  129. return true;
  130. }
  131. return false;
  132. }
  133. //将CISCO格式的网络地址转换为正常格式的IP地址;
  134. CString CMainFrame::HtoIP(CString Hex)
  135. {   
  136.       
  137. char ch[4];
  138. CString ip;
  139.     if (Hex.GetLength()<11)
  140. {
  141. ip="NULL";
  142. return ip;
  143. }
  144. CString Hex1;
  145. Hex.Replace(" ","");
  146. for (int i=0;i<4;i++)
  147.     {
  148.     Hex1=Hex.Mid(i*2,2);
  149. int data=0;
  150.     if((Hex1[0]>='A') && (Hex1[0]<='F')) 
  151.     data=data+Hex1[0]-'A'+10;
  152.     if((Hex1[0]>='0') && (Hex1[0]<='9')) 
  153.     data=data+Hex1[0]-'0';
  154.     data=data*16;
  155. int data1=0;
  156.     if((Hex1[1]>='A') && (Hex1[1]<='F')) 
  157.     data1=data1+Hex1[1]-'A'+10;
  158.     if((Hex1[1]>='0') && (Hex1[1]<='9')) 
  159.     data1=data1+Hex1[1]-'0';
  160. data=data+data1;
  161. itoa(data,ch,10);
  162. ip=ip+ch+'.';
  163. }
  164.     ip=ip.Left(ip.GetLength()-1);
  165. return ip;
  166. }
  167. //扫描获取一个节点中CDP信息的函数,
  168. void CMainFrame::ScanNode(CString &add,CString &community,HTREEITEM hparent)
  169. {
  170. char ch[3];
  171. neighbor n1;
  172. CString BaseOid;
  173. NodeData *p1;
  174. m_snmp.clear();
  175. //清除原来的数据;
  176. for (int i=4;i<10;i++)
  177. {
  178.  BaseOid="1.3.6.1.4.1.9.9.23.1.2.1.1.";
  179.  itoa(i,ch,10);
  180.  BaseOid=BaseOid+ch;
  181.  if (m_snmp.GetTree(add,community,BaseOid)==false)
  182.  {
  183.  MessageBox("获取数据失败,请检查网络和SNMP配置参数!");
  184.  return;
  185.  }
  186. }
  187. //(pNodeData *)(pListView->m_map.GetItemData(hparent))->scan=true;
  188. //将CDP条目表中第4~9六个列对象的实例值取回,并存放在一个MyStringArray
  189. //对象中。关于这些列对象的具体含义请参考本章前面的内容;
  190. p1=(NodeData *)(pListView->m_map.GetItemData(hparent));
  191. p1->scan=true;
  192. //设置已经扫描标志;
  193. int row=m_snmp.GetCount()/6;
  194. CString h;
  195. int j;
  196. for (j=0; j<row;j++)
  197. {
  198. h=m_snmp.GetValue(j);
  199. h.TrimLeft();
  200. h.TrimRight();
  201. h=h.Left(11);
  202. m_snmp.SetValue(j,HtoIP(h));
  203. }
  204. //将得到的IP地址格式转换为正常的格式;
  205. for (j=0; j<row;j++)
  206. {
  207. CString remote="NULL";
  208. CString Temp_oid=m_snmp.GetOid(j);
  209. Temp_oid=Temp_oid.Mid(BaseOid.GetLength()+1,8);
  210. Temp_oid=Temp_oid.Left(Temp_oid.Find('.'));
  211. Temp_oid.TrimLeft();
  212. Temp_oid.TrimRight();
  213. Temp_oid="1.3.6.1.2.1.2.2.1.2."+Temp_oid;
  214. m_snmp.GetOne(add,community,Temp_oid,remote);
  215.     m_snmp.Add(Temp_oid,remote);
  216. }
  217. //获得本地端口名,既通过哪个本地端口获得的该条CDP信息;
  218. int pos=0;
  219. //MessageBox("scaned: "+p1->ip);
  220. for (j=0; j<row;j++)
  221. //对获得的每一份邻居节点信息进行处理。正常情况下,每个CDP条目就是
  222. //一台新发现的设备,都应该在设备树增加一个节点,并在新增的节点中
  223. //保存到本节点的连接信息。但符合下列情况的CDP条目不是新发现设备,
  224. //要做特殊处理:
  225. //   1:和父节点连接的CDP条目;
  226. //   2:和同一节点有多条连接;
  227. //   3:环路;
  228. {    
  229. HTREEITEM h;
  230.     if (p1->m_neighbor.GetSize()>0)
  231.    if (Findport(m_snmp.GetValue(j+6*row),p1))
  232.  
  233.    continue;
  234.  
  235. //和父节点连接的CDP条目,在扫描父节点时这些信息已经保存在本地
  236. //节点中,跳过;
  237.     h=FindNode(pListView->m_map.GetRootItem(),m_snmp.GetValue(j));
  238.     if (h!=NULL)
  239. {
  240.      neighbor n2;
  241.      NodeData * p2=(NodeData *)(pListView->m_map.GetItemData(h));
  242.  n2.Id=hparent;
  243.  n2.localport=m_snmp.GetValue(j+3*row);
  244.  n2.remoteport=m_snmp.GetValue(j+6*row);
  245.  p2->m_neighbor.Add(n2);
  246.      continue;
  247. }
  248. //已经存在的节点,只增加连接信息,不增加新的节点;
  249. pNodeData=new NodeData;
  250. pNodeData->ip=m_snmp.GetValue(j);
  251. pNodeData->sysDescr=m_snmp.GetValue(j+row);
  252. pNodeData->scan=false;
  253. pNodeData->router=false;
  254. pNodeData->level=p1->level+1;
  255. pNodeData->pImage=NULL;
  256. pNodeData->position=p1->position+pos;
  257. pos+=1;
  258. //对任一子节点,层次数等于父节点层次数加1;横向位置以父节点
  259. //为基础,依次累加;
  260. CString rs=m_snmp.GetValue(j+5*row);
  261. rs=rs.Mid(9,2);
  262. if ((atoi(rs)%2)==1)
  263. {
  264. pNodeData->scan=true;
  265.     pNodeData->router=true;
  266. }
  267. if (atoi(rs)>=8)
  268.        pNodeData->scan=false;  
  269. n1.Id=hparent;
  270. n1.localport=m_snmp.GetValue(j+3*row);
  271. n1.remoteport=m_snmp.GetValue(j+6*row);
  272. pNodeData->m_neighbor.Add(n1);
  273.     h=pListView->m_map.InsertItem(m_snmp.GetValue(j),hparent);
  274. pListView->m_map.SetItemData(h,(DWORD)pNodeData);
  275.     NodeArray.Add(h);
  276.  }
  277. }
  278. void CMainFrame::OnScan() 
  279. {   
  280. if (NodeArray.GetSize()>0)
  281. NodeArray.RemoveAll();
  282. if (pListView->m_map.GetCount()>0)
  283.         pListView->m_map.DeleteAllItems();
  284. //清除上次扫描数据;
  285.     NodeData *p1;
  286. CNetMapDoc *pDoc=(CNetMapDoc *)this->GetActiveDocument();
  287. if (pDoc->ip.GetLength()==0||pDoc->community.GetLength()==0)
  288. {
  289. MessageBox("设备地址,Community信息错误!");
  290. return;
  291. }
  292. CString sysoid="1.3.6.1.2.1.1.1.0";
  293. CString reply;
  294. m_snmp.GetOne(pDoc->ip,pDoc->community,sysoid,reply);
  295.     pNodeData=new NodeData;
  296. pNodeData->ip=pDoc->ip;
  297. pNodeData->sysDescr=reply;
  298. pNodeData->scan=false;
  299. pNodeData->pImage=NULL;
  300. pNodeData->level=0;
  301. pNodeData->position=0;
  302. HRoot=pListView->m_map.InsertItem(pDoc->ip);
  303.     NodeArray.Add(HRoot);
  304. pListView->m_map.SetItemData(HRoot,(DWORD)pNodeData);
  305. HCurrent=HRoot;
  306. int NodeNumber;
  307. int i;
  308. while (1)
  309.     {
  310.       NodeNumber=NodeArray.GetSize();
  311.   for(i=0;i<NodeNumber;i++)
  312.   {
  313.        p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[i]));
  314.    if (p1->scan==true) 
  315.        continue;
  316.    ScanNode(p1->ip,pDoc->community,NodeArray[i]);
  317.       }
  318.   if (NodeNumber==NodeArray.GetSize())
  319.   break;
  320. }
  321.     
  322. }
  323. void CMainFrame::OnGraph() 
  324. {
  325.  NodeData *p1;
  326.  int NodeNumber=NodeArray.GetSize();
  327.  if (NodeNumber==0) return;
  328.  //没有图形数据,退出;
  329.  p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[0]));
  330.  if (p1->pImage!=NULL) return;
  331.  //已经生成图形,退出;
  332.  int x=80;
  333.  int y=50;
  334.  //CRect cr;
  335. CBitmap bmpLoad; 
  336.  for(int i=0;i<NodeNumber;i++)
  337.  {
  338.   p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[i]));
  339.   CRect cr(x+100*p1->position,y+80*p1->level,65,35);
  340.   p1->pImage=new CMyImage();
  341.   p1->pImage->Create(NULL,WS_CHILD|SS_BITMAP|WS_VISIBLE|SS_NOTIFY,
  342.                    cr,pNetMapView,IDC_MYIMAGE+i);
  343.   HBITMAP hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
  344.   if (p1->router==true)
  345.   hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
  346.   p1->pImage->SetBitmap(hBitmap);
  347.   p1->pImage->MyPos.x=cr.left+33;
  348.   p1->pImage->MyPos.y=cr.top+12;
  349.   //保存生成连接线时的点坐标;
  350.   p1->pImage->HSelf=NodeArray[i];
  351.   //保存在树形控件中的举柄;
  352.  }
  353. pNetMapView->paint=true;
  354. pNetMapView->RedrawWindow();
  355. }
  356. void CMainFrame::OnShowinformation() 
  357. {
  358.  NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  359.  CShow dlg;
  360.  dlg.m_descr=p1->sysDescr;
  361.  CString local="";
  362.  CString remote="";
  363.  CString ip="";
  364.  for (int i=0;i<p1->m_neighbor.GetSize();i++)
  365.  {
  366.  ip+=pListView->m_map.GetItemText(p1->m_neighbor[i].Id)+"  ";
  367.  local+=p1->m_neighbor[i].localport+"  ";
  368.  remote+=p1->m_neighbor[i].remoteport+"  ";
  369.  }
  370.  dlg.m_localport=local;
  371.  dlg.m_remotelocal=remote;
  372.  dlg.m_ip=ip;
  373.  dlg.DoModal();
  374. }
  375. void CMainFrame::OnNodeModify() 
  376. {
  377. HTREEITEM h;
  378.     NodeData *p1;
  379.     NodeData *p2;
  380. CString Lip,Lport,Rip,Rport;
  381.     CModify dlg;
  382. if(dlg.DoModal()==IDOK)
  383. {
  384. Lip=dlg.m_LocalIp;
  385. Lport=dlg.m_LocalPort;
  386. Rip=dlg.m_RemoteIp;
  387. Rport=dlg.m_RemotePort;
  388. if (dlg.add==true)
  389. {
  390. h=FindNode(pListView->m_map.GetRootItem(),Lip);
  391. if (h!=NULL)
  392. {
  393. MessageBox("要增加的节点已经存在!");
  394. return;
  395. }
  396. h=FindNode(pListView->m_map.GetRootItem(),Rip);
  397. if (h==NULL)
  398. {
  399. MessageBox("上一级节点不存在!");
  400. return;
  401. }
  402. p2=(NodeData *)(pListView->m_map.GetItemData(h));
  403. p1=new NodeData;
  404. p1->ip=Lip;
  405. p1->level=p2->level+1;
  406. p1->position=p2->position;
  407. p1->sysDescr="增加的节点,IP:"+Lip;
  408. if (dlg.m_router==1)
  409. p1->router=true;;
  410. p1->scan=true;
  411. neighbor n1;
  412. n1.Id=h;
  413. n1.localport=Lport;
  414. n1.remoteport=Rport; 
  415. p1->m_neighbor.Add(n1);
  416. //设置邻居节点信息;
  417. HCurrent=pListView->m_map.InsertItem(Lip,h);
  418. NodeArray.Add(HCurrent);
  419. //在tree中增加节点,父节点为制定节点;
  420. h=pListView->m_map.GetPrevSiblingItem(HCurrent);
  421. if (h!=NULL)
  422.             {
  423. p2=(NodeData *)(pListView->m_map.GetItemData(h));
  424. p1->position=p2->position+1;
  425. }
  426.      
  427. //根据前面的兄弟节点的位置信息,获取新增加节点的位置信息;
  428. pListView->m_map.SetItemData(HCurrent,(DWORD)p1);
  429. //设置data属性;
  430. p1=(NodeData *)(pListView->m_map.GetItemData(pListView->m_map.GetRootItem()));
  431.             p2=(NodeData *)pListView->m_map.GetItemData(HCurrent);
  432. if (p1->pImage!=NULL)
  433. {
  434.              CRect cr(80+100*p2->position,50+80*p2->level,65,35);
  435.              p2->pImage=new CMyImage();
  436.              p2->pImage->Create(NULL,WS_CHILD|SS_BITMAP|WS_VISIBLE|SS_NOTIFY,
  437.                    cr,pNetMapView,IDC_MYIMAGE+NodeArray.GetSize()+1);
  438.               HBITMAP hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
  439.              if (p2->router==true)
  440.              hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
  441.              p2->pImage->SetBitmap(hBitmap);
  442.              p2->pImage->MyPos.x=cr.left+33;
  443.              p2->pImage->MyPos.y=cr.top+12;
  444.             //保存生成连接线时的点坐标;
  445.              p2->pImage->HSelf=HCurrent;
  446. }
  447. pNetMapView->RedrawWindow();
  448.             pListView->RedrawWindow();
  449. }
  450. else
  451. {
  452. h=FindNode(pListView->m_map.GetRootItem(),Lip);
  453. if (h==NULL)
  454. {
  455. MessageBox("要合并的节点不存在!");
  456. return;
  457. }
  458. HCurrent=FindNode(pListView->m_map.GetRootItem(),Rip);
  459. if (h==NULL)
  460. {
  461. MessageBox("上一级节点不存在!");
  462. return;
  463. }
  464. if ((pListView->m_map.GetChildItem(h)) ||(pListView->m_map.GetChildItem(HCurrent)))
  465. {
  466.              MessageBox("只有叶子节点才能被合并!");
  467. return;
  468. }
  469.             p1=(NodeData *)(pListView->m_map.GetItemData(h));
  470. p2=(NodeData *)(pListView->m_map.GetItemData(HCurrent));
  471.     if ((p1->router!=true) ||(p2->router!=true))
  472.             {
  473. MessageBox("要合并的设备必须是路由设备!");
  474. return;
  475. }
  476. p2->m_neighbor.Append(p1->m_neighbor);
  477. //合并连结信息;
  478. for(int i=0;i<NodeArray.GetSize();i++)
  479. {
  480. if (NodeArray[i]==h)
  481. {
  482. NodeArray.RemoveAt(i);
  483. break;
  484. }
  485. }
  486. if (p1->pImage!=NULL) delete p1->pImage;
  487. delete p1;
  488. pListView->m_map.DeleteItem(h);
  489. pNetMapView->RedrawWindow();
  490.             pListView->RedrawWindow();
  491. }
  492. }
  493. }