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

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. #include "Input.h"
  11. #include "AddVlan.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CMainFrame
  19. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  20. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  21. //{{AFX_MSG_MAP(CMainFrame)
  22. ON_WM_CREATE()
  23. ON_COMMAND(ID_SCAN, OnScan)
  24. ON_COMMAND(ID_GRAPH, OnGraph)
  25. ON_COMMAND(ID_SHOWINFORMATION, OnShowinformation)
  26. ON_COMMAND(ID_NODE_MODIFY, OnNodeModify)
  27. ON_COMMAND(ID_VLAN, OnVlan)
  28. ON_COMMAND(ID_PORT, OnPort)
  29. ON_COMMAND(ID_ADD_MAP, OnAddMap)
  30. ON_COMMAND(ID_VALN_TOPO, OnValnTopo)
  31. ON_COMMAND(ID_ADD_VLAN, OnAddVlan)
  32. ON_COMMAND(ID_DELETE_VLAN, OnDeleteVlan)
  33. ON_COMMAND(ID_PORT_MORE, OnPortMore)
  34. ON_COMMAND(ID_TO_VLAN, OnToVlan)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. static UINT indicators[] =
  38. {
  39. ID_SEPARATOR,           // status line indicator
  40. ID_INDICATOR_CAPS,
  41. ID_INDICATOR_NUM,
  42. ID_INDICATOR_SCRL,
  43. };
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CMainFrame construction/destruction
  46. CMainFrame::CMainFrame()
  47. {
  48. // TODO: add member initialization code here
  49. }
  50. CMainFrame::~CMainFrame()
  51. {
  52. }
  53. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  54. {
  55. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  56. return -1;
  57. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  58. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  59. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  60. {
  61. TRACE0("Failed to create toolbarn");
  62. return -1;      // fail to create
  63. }
  64. if (!m_wndStatusBar.Create(this) ||
  65. !m_wndStatusBar.SetIndicators(indicators,
  66.   sizeof(indicators)/sizeof(UINT)))
  67. {
  68. TRACE0("Failed to create status barn");
  69. return -1;      // fail to create
  70. }
  71. // TODO: Delete these three lines if you don't want the toolbar to
  72. //  be dockable
  73. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  74. EnableDocking(CBRS_ALIGN_ANY);
  75. DockControlBar(&m_wndToolBar);
  76. //获得当前目录;
  77.    /* CurrDir=_pgmptr;
  78. CurrDir.MakeReverse();
  79.     int path=CurrDir.Find('\');
  80. CurrDir.MakeReverse();
  81.     CurrDir=CurrDir.Left(CurrDir.GetLength()-path);*/
  82. return 0;
  83. }
  84. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  85. {
  86. if( !CFrameWnd::PreCreateWindow(cs) )
  87. return FALSE;
  88. // TODO: Modify the Window class or styles here by modifying
  89. //  the CREATESTRUCT cs
  90. cs.x=1;
  91. cs.y=1;
  92.     cs.cx=800;
  93. cs.cy=750;
  94. return TRUE;
  95. }
  96. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
  97. {
  98. BOOL Result=v.CreateStatic(this,1,2,WS_CHILD | WS_VISIBLE);
  99. ASSERT(Result);
  100. h.CreateStatic(&v,2,1,WS_CHILD | WS_VISIBLE,v.IdFromRowCol(0,1));
  101. v.CreateView(0,0,RUNTIME_CLASS(CMapView),CSize(210,600),pContext);
  102. h.CreateView(0,0,RUNTIME_CLASS(CNetMapView),CSize(310,300),pContext);
  103. h.CreateView(1,0,RUNTIME_CLASS(CVlanView),CSize(310,300),pContext);
  104. //v.SetActivePane(0,0,NULL);
  105. return Result;
  106. }
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CMainFrame diagnostics
  109. #ifdef _DEBUG
  110. void CMainFrame::AssertValid() const
  111. {
  112. CFrameWnd::AssertValid();
  113. }
  114. void CMainFrame::Dump(CDumpContext& dc) const
  115. {
  116. CFrameWnd::Dump(dc);
  117. }
  118. #endif //_DEBUG
  119. /////////////////////////////////////////////////////////////////////////////
  120. // CMainFrame message handlers
  121. CString CMainFrame::FindVlan(int id)
  122. {   
  123. char ch[4];
  124.     CString str;
  125. itoa(id,ch,10);
  126. str=ch;
  127. HTREEITEM Temp=pListView->m_vlan.GetRootItem();
  128. if (Temp!=NULL)
  129.     {
  130. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_CHILD);
  131. Vlan * p=(Vlan *)pListView->m_vlan.GetItemData(Temp);
  132. if (p->Id==str)
  133. return p->Name;
  134. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_NEXT);
  135. while (Temp!=NULL)
  136. {
  137. p=(Vlan *)pListView->m_vlan.GetItemData(Temp);
  138. if (p->Id==str)
  139. return p->Name;
  140. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_NEXT);
  141. }
  142. }
  143. return "";
  144. }
  145. CString CMainFrame::HexTo01(CString &s)
  146. {
  147.     CString str="";
  148. CString key,value;
  149. s.Replace(" ","");
  150. TempMap.SetAt("F","1111");
  151. TempMap.SetAt("E","1110");
  152.     TempMap.SetAt("D","1101");
  153. TempMap.SetAt("C","1100");
  154. TempMap.SetAt("B","1011");
  155. TempMap.SetAt("A","1010");
  156.     TempMap.SetAt("9","1001");
  157. TempMap.SetAt("8","1000");
  158.     TempMap.SetAt("7","0111");
  159. TempMap.SetAt("6","0110");
  160.     TempMap.SetAt("5","0101");
  161. TempMap.SetAt("4","0100");
  162. TempMap.SetAt("3","0011");
  163. TempMap.SetAt("2","0010");
  164.     TempMap.SetAt("1","0001");
  165. TempMap.SetAt("0","0000");
  166.     for(int i=0;i<s.GetLength();i++)
  167. {
  168. key=s[i];
  169. TempMap.Lookup(key,value);
  170. str+=value;
  171. }
  172. return str;
  173. }
  174. HTREEITEM CMainFrame::FindNode(HTREEITEM hSubRoot,const CString &text)
  175. {
  176.     if (hSubRoot==NULL) 
  177. return NULL;
  178. //判断是否符合条件,如是,返回该节点的句柄;
  179.     if (pListView->m_map.GetItemText(hSubRoot)==text)
  180. return hSubRoot;
  181. hSubRoot=pListView->m_map.GetChildItem(hSubRoot);
  182. do 
  183. {
  184.        HTREEITEM ht;
  185.    //递归调用FindNode;
  186.    if ((ht=FindNode(hSubRoot,text)) !=NULL)
  187.    return ht;
  188. } while ((hSubRoot=pListView->m_map.GetNextSiblingItem(hSubRoot)) !=NULL);
  189.     return NULL;
  190. }
  191. bool CMainFrame::Findport(CString &port,NodeData *p)
  192. {
  193. for (int i=0;i<(p->m_neighbor.GetSize());i++)
  194. {
  195. // (p->m_neighbor).GetAt[i];
  196. if (p->m_neighbor.GetAt(i).localport==port)
  197. return true;
  198. }
  199. return false;
  200. }
  201. //CDP表项中的IP地址,需要转换;
  202. CString CMainFrame::HtoIP(CString Hex)
  203. {   
  204.       
  205. char ch[4];
  206. CString ip;
  207.     if (Hex.GetLength()<11)
  208. {
  209. ip="NULL";
  210. return ip;
  211. }
  212. CString Hex1;
  213. Hex.Replace(" ","");
  214. for (int i=0;i<4;i++)
  215.     {
  216.     Hex1=Hex.Mid(i*2,2);
  217. int data=0;
  218.     if((Hex1[0]>='A') && (Hex1[0]<='F')) 
  219.     data=data+Hex1[0]-'A'+10;
  220.     if((Hex1[0]>='0') && (Hex1[0]<='9')) 
  221.     data=data+Hex1[0]-'0';
  222.     data=data*16;
  223. int data1=0;
  224.     if((Hex1[1]>='A') && (Hex1[1]<='F')) 
  225.     data1=data1+Hex1[1]-'A'+10;
  226.     if((Hex1[1]>='0') && (Hex1[1]<='9')) 
  227.     data1=data1+Hex1[1]-'0';
  228. data=data+data1;
  229. itoa(data,ch,10);
  230. ip=ip+ch+'.';
  231. }
  232.     ip=ip.Left(ip.GetLength()-1);
  233. return ip;
  234. }
  235. void CMainFrame::ScanNode(CString &add,CString &community,HTREEITEM hparent)
  236. {
  237. char ch[3];
  238. neighbor n1;
  239. CString BaseOid;
  240. NodeData *p1;
  241. m_snmp.clear();
  242. //清除原来的数据;
  243. for (int i=4;i<10;i++)
  244. {
  245.  BaseOid="1.3.6.1.4.1.9.9.23.1.2.1.1.";
  246.  itoa(i,ch,10);
  247.  BaseOid=BaseOid+ch;
  248.  if (m_snmp.GetTree(add,community,BaseOid)==false)
  249.  {
  250.  MessageBox("获取数据失败,请检查网络和SNMP配置参数!");
  251.  return;
  252.  }
  253.  
  254. }
  255. //(pNodeData *)(pListView->m_map.GetItemData(hparent))->scan=true;
  256. //将CDP条目表中第4~9六个列对象的实例值取回,并存放在一个MyStringArray
  257. //对象中。关于这些列对象的具体含义请参考本章前面的内容;
  258. p1=(NodeData *)(pListView->m_map.GetItemData(hparent));
  259. p1->scan=true;
  260. //设置已经扫描标志;
  261. int row=m_snmp.GetCount()/6;
  262. CString h;
  263. int j;
  264. for (j=0; j<row;j++)
  265. {
  266. h=m_snmp.GetValue(j);
  267. h.TrimLeft();
  268. h.TrimRight();
  269. h=h.Left(11);
  270. m_snmp.SetValue(j,HtoIP(h));
  271. }
  272. //将得到的IP地址格式转换为正常的格式;
  273. for (j=0; j<row;j++)
  274. {
  275. CString remote="NULL";
  276. CString Temp_oid=m_snmp.GetOid(j);
  277. Temp_oid=Temp_oid.Mid(BaseOid.GetLength()+1,8);
  278. Temp_oid=Temp_oid.Left(Temp_oid.Find('.'));
  279. Temp_oid.TrimLeft();
  280. Temp_oid.TrimRight();
  281. Temp_oid="1.3.6.1.2.1.2.2.1.2."+Temp_oid;
  282. m_snmp.GetOne(add,community,Temp_oid,remote);
  283.     m_snmp.Add(Temp_oid,remote);
  284. }
  285. //获得本地端口名,既通过哪个本地端口获得的该条CDP信息;
  286. int pos=0;
  287. //MessageBox("scaned: "+p1->ip);
  288. for (j=0; j<row;j++)
  289. //对获得的每一份邻居节点信息进行处理。正常情况下,每个CDP条目就是
  290. //一台新发现的设备,都应该在设备树增加一个节点,并在新增的节点中
  291. //保存到本节点的连接信息。但下列情况要做特殊处理:
  292. //   1:和父节点连接的CDP条目;
  293. //   2:和同一节点有多条连接;
  294. //   3:环路;
  295. {    
  296. HTREEITEM h;
  297.     if (p1->m_neighbor.GetSize()>0)
  298.    if (Findport(m_snmp.GetValue(j+6*row),p1))
  299.  
  300.    continue;
  301.  
  302. //和父节点连接的CDP条目,在扫描父节点时这些信息已经保存在本地
  303. //节点中,跳过;
  304.     h=FindNode(pListView->m_map.GetRootItem(),m_snmp.GetValue(j));
  305.     if (h!=NULL)
  306. {
  307.      neighbor n2;
  308.      NodeData * p2=(NodeData *)(pListView->m_map.GetItemData(h));
  309.  n2.Id=hparent;
  310.  n2.localport=m_snmp.GetValue(j+3*row);
  311.  n2.remoteport=m_snmp.GetValue(j+6*row);
  312.  p2->m_neighbor.Add(n2);
  313.      continue;
  314. }
  315. //已经存在的节点,只增加连接信息,不增加新的节点;
  316. pNodeData=new NodeData;
  317. pNodeData->ip=m_snmp.GetValue(j);
  318. pNodeData->sysDescr=m_snmp.GetValue(j+row);
  319. pNodeData->scan=false;
  320. pNodeData->router=false;
  321. pNodeData->level=p1->level+1;
  322. pNodeData->pImage=NULL;
  323. pNodeData->position=p1->position+pos;
  324. pos+=1;
  325. //对任一子节点,层次数等于父节点层次数加1;横向位置以父节点
  326. //为基础,依次累加;
  327. CString rs=m_snmp.GetValue(j+5*row);
  328. rs=rs.Mid(9,2);
  329. if ((atoi(rs)%2)==1)
  330. {
  331. pNodeData->scan=true;
  332.     pNodeData->router=true;
  333. }
  334. if (atoi(rs)>=8)
  335.        pNodeData->scan=false;  
  336. n1.Id=hparent;
  337. n1.localport=m_snmp.GetValue(j+3*row);
  338. n1.remoteport=m_snmp.GetValue(j+6*row);
  339. pNodeData->m_neighbor.Add(n1);
  340.     h=pListView->m_map.InsertItem(m_snmp.GetValue(j),hparent);
  341. pListView->m_map.SetItemData(h,(DWORD)pNodeData);
  342.     NodeArray.Add(h);
  343.  }
  344. }
  345. void CMainFrame::OnScan() 
  346. {   
  347. if (NodeArray.GetSize()>0)
  348. NodeArray.RemoveAll();
  349. if (pListView->m_map.GetCount()>0)
  350.         pListView->m_map.DeleteAllItems();
  351. //清除上次扫描数据;
  352.     NodeData *p1;
  353. CNetMapDoc *pDoc=(CNetMapDoc *)this->GetActiveDocument();
  354. if (pDoc->ip.GetLength()==0||pDoc->community.GetLength()==0)
  355. {
  356. MessageBox("设备地址,Community信息错误!");
  357. return;
  358. }
  359. CString sysoid="1.3.6.1.2.1.1.1.0";
  360. CString reply;
  361. m_snmp.GetOne(pDoc->ip,pDoc->community,sysoid,reply);
  362.     pNodeData=new NodeData;
  363. pNodeData->ip=pDoc->ip;
  364. pNodeData->sysDescr=reply;
  365. pNodeData->scan=false;
  366. pNodeData->pImage=NULL;
  367. pNodeData->level=0;
  368. pNodeData->position=0;
  369. HRoot=pListView->m_map.InsertItem(pDoc->ip);
  370.     NodeArray.Add(HRoot);
  371. pListView->m_map.SetItemData(HRoot,(DWORD)pNodeData);
  372. HCurrent=HRoot;
  373. int NodeNumber;
  374. int i;
  375. while (1)
  376.     {
  377.       NodeNumber=NodeArray.GetSize();
  378.   for(i=0;i<NodeNumber;i++)
  379.   {
  380.        p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[i]));
  381.    if (p1->scan==true) 
  382.        continue;
  383.    ScanNode(p1->ip,pDoc->community,NodeArray[i]);
  384.        //MessageBox(pListView->m_map.GetItemText(NodeArray[i]));
  385.   }
  386.   if (NodeNumber==NodeArray.GetSize())
  387.   break;
  388. }
  389.  }
  390. void CMainFrame::OnGraph() 
  391. {
  392.  NodeData *p1;
  393.  int NodeNumber=NodeArray.GetSize();
  394.  if (NodeNumber==0) return;
  395.  //没有图形数据,退出;
  396.  p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[0]));
  397.  if (p1->pImage!=NULL) return;
  398.  //已经生成图形,退出;
  399.  int x=80;
  400.  int y=50;
  401.  //CRect cr;
  402. CBitmap bmpLoad; 
  403.  for(int i=0;i<NodeNumber;i++)
  404.  {
  405.   p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[i]));
  406.   CRect cr(x+100*p1->position,y+80*p1->level,55,25);
  407.   p1->pImage=new CMyImage();
  408.   p1->pImage->Create(NULL,WS_CHILD|SS_BITMAP|WS_VISIBLE|SS_NOTIFY,
  409.                    cr,pNetMapView,IDC_MYIMAGE+i);
  410.   HBITMAP hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_S));
  411.   if (p1->router==true)
  412.   hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_R));
  413.   p1->pImage->SetBitmap(hBitmap);
  414.   p1->pImage->MyPos.x=cr.left+23;
  415.   p1->pImage->MyPos.y=cr.top+8;
  416.   //保存生成连接线时的点坐标;
  417.   p1->pImage->HSelf=NodeArray[i];
  418.   //保存在树形控件中的句柄;
  419.  }
  420. pNetMapView->paint=true;
  421. pNetMapView->RedrawWindow();
  422. }
  423. void CMainFrame::OnShowinformation() 
  424. {
  425.  NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  426.  CShow dlg;
  427.  dlg.m_descr=p1->sysDescr;
  428.  CString local="";
  429.  CString remote="";
  430.  CString ip="";
  431.  for (int i=0;i<p1->m_neighbor.GetSize();i++)
  432.  {
  433.  ip+=pListView->m_map.GetItemText(p1->m_neighbor[i].Id)+"  ";
  434.  local+=p1->m_neighbor[i].localport+"  ";
  435.  remote+=p1->m_neighbor[i].remoteport+"  ";
  436.  }
  437.  dlg.m_localport=local;
  438.  dlg.m_remotelocal=remote;
  439.  dlg.m_ip=ip;
  440.  dlg.DoModal();
  441. }
  442. void CMainFrame::OnNodeModify() 
  443. {
  444. HTREEITEM h;
  445.     NodeData *p1;
  446.     NodeData *p2;
  447. CString Lip,Lport,Rip,Rport;
  448.     CModify dlg;
  449. if(dlg.DoModal()==IDOK)
  450. {
  451. Lip=dlg.m_LocalIp;
  452. Lport=dlg.m_LocalPort;
  453. Rip=dlg.m_RemoteIp;
  454. Rport=dlg.m_RemotePort;
  455. if (dlg.add==true)
  456. {
  457. h=FindNode(pListView->m_map.GetRootItem(),Lip);
  458. if (h!=NULL)
  459. {
  460. MessageBox("要增加的节点已经存在!");
  461. return;
  462. }
  463. h=FindNode(pListView->m_map.GetRootItem(),Rip);
  464. if (h==NULL)
  465. {
  466. MessageBox("上一级节点不存在!");
  467. return;
  468. }
  469. p2=(NodeData *)(pListView->m_map.GetItemData(h));
  470. p1=new NodeData;
  471. p1->ip=Lip;
  472. p1->level=p2->level+1;
  473. p1->position=p2->position;
  474. p1->sysDescr="增加的节点,IP:"+Lip;
  475. if (dlg.m_router==1)
  476. p1->router=true;;
  477. p1->scan=true;
  478. neighbor n1;
  479. // NodeData * p2=(NodeData *)(pListView->m_map.GetItemData(h));
  480. n1.Id=h;
  481. n1.localport=Lport;
  482. n1.remoteport=Rport; 
  483. p1->m_neighbor.Add(n1);
  484. //设置邻居节点信息;
  485. HCurrent=pListView->m_map.InsertItem(Lip,h);
  486. NodeArray.Add(HCurrent);
  487. //在tree中增加节点,父节点为制定节点;
  488. h=pListView->m_map.GetPrevSiblingItem(HCurrent);
  489. if (h!=NULL)
  490.             {
  491. p2=(NodeData *)(pListView->m_map.GetItemData(h));
  492. p1->position=p2->position+1;
  493. }
  494.      
  495. //根据前面的兄弟节点的位置信息,获取新增加节点的位置信息;
  496. pListView->m_map.SetItemData(HCurrent,(DWORD)p1);
  497. //设置data属性;
  498. p1=(NodeData *)(pListView->m_map.GetItemData(pListView->m_map.GetRootItem()));
  499.             p2=(NodeData *)pListView->m_map.GetItemData(HCurrent);
  500. if (p1->pImage!=NULL)
  501. {
  502.              CRect cr(80+100*p2->position,50+80*p2->level,65,35);
  503.              p2->pImage=new CMyImage();
  504.              p2->pImage->Create(NULL,WS_CHILD|SS_BITMAP|WS_VISIBLE|SS_NOTIFY,
  505.                    cr,pNetMapView,IDC_MYIMAGE+NodeArray.GetSize()+1);
  506.               HBITMAP hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
  507.              if (p2->router==true)
  508.              hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
  509.              p2->pImage->SetBitmap(hBitmap);
  510.              p2->pImage->MyPos.x=cr.left+33;
  511.              p2->pImage->MyPos.y=cr.top+12;
  512.             //保存生成连接线时的点坐标;
  513.              p2->pImage->HSelf=HCurrent;
  514. }
  515. pNetMapView->RedrawWindow();
  516.             pListView->RedrawWindow();
  517. }
  518. else
  519. {
  520. h=FindNode(pListView->m_map.GetRootItem(),Lip);
  521. if (h==NULL)
  522. {
  523. MessageBox("要合并的节点不存在!");
  524. return;
  525. }
  526. HCurrent=FindNode(pListView->m_map.GetRootItem(),Rip);
  527. if (h==NULL)
  528. {
  529. MessageBox("上一级节点不存在!");
  530. return;
  531. }
  532. if ((pListView->m_map.GetChildItem(h)) ||(pListView->m_map.GetChildItem(HCurrent)))
  533. {
  534.              MessageBox("只有叶子节点才能被合并!");
  535. return;
  536. }
  537.             p1=(NodeData *)(pListView->m_map.GetItemData(h));
  538. p2=(NodeData *)(pListView->m_map.GetItemData(HCurrent));
  539.     if ((p1->router!=true) ||(p2->router!=true))
  540.             {
  541. MessageBox("要合并的设备必须是路由设备!");
  542. return;
  543. }
  544. p2->m_neighbor.Append(p1->m_neighbor);
  545. //合并连结信息;
  546. for(int i=0;i<NodeArray.GetSize();i++)
  547. {
  548. if (NodeArray[i]==h)
  549. {
  550. NodeArray.RemoveAt(i);
  551. break;
  552. }
  553. }
  554. if (p1->pImage!=NULL) delete p1->pImage;
  555. delete p1;
  556. pListView->m_map.DeleteItem(h);
  557. pNetMapView->RedrawWindow();
  558.             pListView->RedrawWindow();
  559. }
  560. }
  561. }
  562. void CMainFrame::OnVlan() 
  563. {  
  564. Name2Id.RemoveAll();
  565.     NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  566. if (p1->router==true) 
  567. {
  568. MessageBox("该设备中不包含Vlan信息!");
  569. return;
  570. }
  571. //如果是路由器,退出;
  572.     HTREEITEM Temp=pListView->m_vlan.GetRootItem();
  573. if (Temp!=NULL)
  574.     {
  575. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_CHILD);
  576. Vlan * p2=(Vlan *)pListView->m_vlan.GetItemData(Temp);
  577. if (p2!=NULL) delete p2;
  578. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_NEXT);
  579. while (Temp!=NULL)
  580. {
  581. p2=(Vlan *)pListView->m_vlan.GetItemData(Temp);
  582. if (p2!=NULL) delete p2;
  583. Temp=pListView->m_vlan.GetNextItem(Temp,TVGN_NEXT);
  584. }
  585. pListView->m_vlan.DeleteAllItems();
  586. pListView->RedrawWindow();
  587. }
  588. //判断是否已经存在 VLAN信息,如存在,清除原有节点并释放
  589. //资源,重新采集信息;
  590.     HRoot=pListView->m_vlan.InsertItem(p1->ip,0,0,NULL);
  591. //插入根节点;
  592. m_snmp.clear();
  593. CString community="public";
  594. CString TempOid="1.3.6.1.4.1.9.9.46.1.3.1.1.2";
  595. m_snmp.GetTree(p1->ip,community,TempOid);
  596. //取回VLAN运行状态信息;
  597.     TempOid="1.3.6.1.4.1.9.9.46.1.3.1.1.4";
  598. m_snmp.GetTree(p1->ip,community,TempOid);
  599. //取回VLAN名字信息;
  600. m_temp.clear();
  601. TempOid="1.3.6.1.4.1.9.9.68.1.2.2.1.2";
  602. m_temp.GetTree(p1->ip,community,TempOid);
  603. //取回交换机中所有接口(非TRUNK)所属VLAN信息; 
  604. int row=m_snmp.GetCount()/2;
  605. CString h,s,r,NameOid;
  606. for (int i=0;i<row;i++)
  607. {   
  608. //处理每个VLAN信息;
  609. pVlanData=new Vlan;
  610. pVlanData->State=m_snmp.GetValue(i);
  611. pVlanData->Name=m_snmp.GetValue(i+row);
  612. //保存信息;
  613. h=m_snmp.GetOid(i);
  614. h.TrimLeft();
  615. h.TrimRight();
  616. h=h.Mid(h.ReverseFind('.')+1,4);
  617. pVlanData->Id=h;
  618. //处理OID获得并保存VLAN-id;
  619. Name2Id.SetAt(pVlanData->Name,pVlanData->Id);
  620.         for(int j=0;j<m_temp.GetCount();j++)
  621. {
  622. //检查每一个非 TRUNK接口所属的vlan,并将该接口
  623. //的索引,名字保存在相应的VLAN节点data属性结构中;
  624. if (m_temp.GetValue(j)==h)
  625. //m_temp中第j个接口属于VLAN-id为h的VLAN,即正在
  626. //处理的VLAN;
  627. {
  628. s=m_temp.GetOid(j);
  629.                 s=s.Mid(s.ReverseFind('.')+1,4);
  630. //获取该接口的IfIndex;
  631. NameOid="1.3.6.1.2.1.2.2.1.2."+s;
  632. m_temp.GetOne(p1->ip,community,NameOid,r);
  633. //获取该接口的名字;
  634. port p;
  635. p.PortIndex=s;
  636. p.PortName=r;
  637. pVlanData->PortArray.Add(p);
  638. //保存接口信息;
  639. }
  640. }
  641. HCurrent=pListView->m_vlan.InsertItem(pVlanData->Name,1,1,HRoot);
  642. //为每一个VLAN在树形控件中增加节点;
  643. if (pVlanData->State!="1") pListView->m_vlan.SetItemImage(HCurrent,2,2);
  644. if (pVlanData->PortArray.GetSize()>0)
  645. for (j=0;j<pVlanData->PortArray.GetSize();j++)
  646. pListView->m_vlan.InsertItem(pVlanData->PortArray[j].PortName,3,3,HCurrent);
  647. //为每一个VLAN所拥有的接口增加节点;
  648. pListView->m_vlan.SetItemData(HCurrent,(DWORD)pVlanData);
  649. }
  650. pListView->m_vlan.Expand(HRoot,TVE_EXPAND);
  651. if (pListView->m_tab.GetCurSel()==0) 
  652. {
  653. pListView->m_tab.SetCurSel(1);
  654. pListView->m_vlan.ShowWindow(SW_SHOW);
  655. pListView->m_map.ShowWindow(SW_HIDE);
  656. }
  657. //更新TAB的状态;
  658. }
  659. void CMainFrame::OnPort() 
  660. {
  661. if (pListView->m_vlan.GetRootItem()==NULL)
  662. {
  663. MessageBox("先获取vlan信息!");
  664. return;
  665. }
  666. NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  667. if (p1->router==true) 
  668. {
  669. MessageBox("该设备不是交换机!");
  670. return;
  671. }
  672. //如果是路由器,退出;
  673. m_snmp.clear();
  674. CString community="public";
  675. CString TempOid="1.3.6.1.4.1.9.9.68.1.2.2.1.2";
  676. m_snmp.GetTree(p1->ip,community,TempOid);
  677. //获得所有非TRUNK端口信息;
  678. CString s,r;
  679.     for (int i=0;i<SwitchPortArray.GetSize();i++)
  680. {
  681. if (SwitchPortArray[i]->pPortImage!=NULL) 
  682. delete SwitchPortArray[i]->pPortImage; 
  683. if (SwitchPortArray[i]->pHostImage!=NULL) 
  684. delete SwitchPortArray[i]->pHostImage; 
  685. delete SwitchPortArray[i];
  686. }
  687. SwitchPortArray.RemoveAll();
  688. pVlanView->RedrawWindow();
  689. for (i=0;i<m_snmp.GetCount();i++)
  690. {
  691. pSP=new SwitchPort;
  692. pSP->trunk=false;
  693. pSP->SwitchIP=p1->ip;
  694. // pSP->ArrayIndex=i;
  695. pSP->PortVlan=m_snmp.GetValue(i);
  696. //所属VLAN;
  697. s=m_snmp.GetOid(i);
  698. s.TrimLeft();
  699. s.TrimRight();
  700. s=s.Mid(s.ReverseFind('.')+1,4);
  701. pSP->PortIndex=s;
  702. //该端口的IfIndex;
  703. TempOid="1.3.6.1.2.1.2.2.1.2."+s;
  704.         m_snmp.GetOne(p1->ip,community,TempOid,r);
  705. pSP->PortName=r;
  706. //端口名字;
  707. TempOid="1.3.6.1.2.1.2.2.1.8."+s;
  708.         m_snmp.GetOne(p1->ip,community,TempOid,r);
  709. if (r=="1") 
  710. pSP->PortStatus="UP";
  711.         else
  712. pSP->PortStatus="Down";
  713. //端口状态;
  714.         pSP->pPortImage=NULL;
  715.         pSP->pHostImage=NULL;
  716.         SwitchPortArray.Add(pSP);
  717. }
  718.     m_snmp.clear();
  719. TempOid="1.3.6.1.2.1.17.4.3.1.3";
  720. m_snmp.GetTree(p1->ip,community,TempOid);
  721. //该地址的获取方式;
  722.     TempOid="1.3.6.1.2.1.17.4.3.1.2";
  723. m_snmp.GetTree(p1->ip,community,TempOid);
  724. //该地址的来源端口;
  725.     TempOid="1.3.6.1.2.1.17.4.3.1.1";
  726. m_snmp.GetTree(p1->ip,community,TempOid);
  727.     //MAC地址;
  728. int row=m_snmp.GetCount()/3;
  729. AddMap add;
  730. for (i=0;i<row;i++)
  731. {
  732. if (m_snmp.GetValue(i)=="3")
  733. TempOid="1.3.6.1.2.1.17.1.4.1.2."+m_snmp.GetValue(i+row);
  734. m_snmp.GetOne(p1->ip,community,TempOid,r);
  735. for (int j=0;j<SwitchPortArray.GetSize();j++)
  736. {
  737. if (SwitchPortArray[j]->PortIndex==r)
  738. {
  739. add.hAdd=m_snmp.GetValue(i+2*row);
  740. add.hAdd=add.hAdd.Left(17);
  741. add.hIp="";
  742. if (M2I.IsEmpty()==0)
  743. M2I.Lookup(add.hAdd,add.hIp);
  744. if (add.hIp.GetLength()==0)
  745. add.hIp="*.*.*.*";
  746. SwitchPortArray[j]->HostAdd.Add(add);
  747. }
  748. }
  749. // TempMap.SetAt(r,m_snmp.GetValue(i+2*row));
  750. }
  751. }
  752.     m_snmp.clear();
  753. TempOid="1.3.6.1.4.1.9.9.46.1.6.1.1.3";
  754. m_snmp.GetTree(p1->ip,community,TempOid);
  755. CString temp;
  756. //获取TRUNK端口的封装类型;
  757.     TempOid="1.3.6.1.4.1.9.9.46.1.6.1.1.4";
  758. m_snmp.GetTree(p1->ip,community,TempOid);
  759. //该Trunk端口允许的VLAN;
  760.     row=m_snmp.GetCount()/2;
  761.     for (i=0;i<row;i++)
  762. {
  763. pSP=new SwitchPort;
  764. pSP->trunk=true;
  765. pSP->pHostImage=NULL;
  766. pSP->pPortImage=NULL;
  767.         s=m_snmp.GetOid(i);
  768.         s=s.Mid(s.ReverseFind('.')+1,4);
  769. pSP->PortIndex=s;
  770.         TempOid="1.3.6.1.2.1.2.2.1.2."+s;
  771.         m_snmp.GetOne(p1->ip,community,TempOid,r);
  772. pSP->PortName=r;
  773. if (m_snmp.GetValue(i)=="1") pSP->PortStatus="ISL";
  774. if (m_snmp.GetValue(i)=="2") pSP->PortStatus="Dot10";
  775. if (m_snmp.GetValue(i)=="3") pSP->PortStatus="Lane";
  776. if (m_snmp.GetValue(i)=="4") pSP->PortStatus="Dot1Q";
  777. if (m_snmp.GetValue(i)=="5") pSP->PortStatus="Negotiate";
  778. temp=m_snmp.GetValue(i+row);
  779. temp.Replace(".","");
  780. temp.Replace(" ","");
  781. temp=temp.Left(32);
  782. pSP->Vlans=HexTo01(temp);
  783. SwitchPortArray.Add(pSP);
  784. }
  785. int index,x,y;
  786. HICON hComputer,hNet,hIcon_gu,hIcon_gd,hIcon_dd,hIcon_du;
  787. hComputer= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  788. MAKEINTRESOURCE(IDI_COMPUTER), IMAGE_ICON, 32, 32, 0);
  789. hNet= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  790. MAKEINTRESOURCE(IDI_NET), IMAGE_ICON, 32, 32, 0);
  791. hIcon_gu= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  792. MAKEINTRESOURCE(IDI_RUNPORT), IMAGE_ICON, 32, 32, 0);
  793. hIcon_gd= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  794. MAKEINTRESOURCE(IDI_DRUNPORT), IMAGE_ICON, 32, 32, 0);
  795. hIcon_dd= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  796. MAKEINTRESOURCE(IDI_DDEADPORT), IMAGE_ICON, 32, 32, 0);
  797. hIcon_du= (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  798. MAKEINTRESOURCE(IDI_UDEADPORT), IMAGE_ICON, 32, 32, 0);
  799. for (i=0;i<SwitchPortArray.GetSize();i++)
  800. {   
  801. index=atoi(SwitchPortArray[i]->PortIndex);
  802. y=100+((index+1) % 2)*34;
  803. if ((index % 2)==0)
  804. x=(index-1)*16+50;
  805. else
  806. x=index*16+50;
  807. CRect cr(x,y,16,16);
  808. SwitchPortArray[i]->pPortImage=new CMyImage();
  809.         SwitchPortArray[i]->pPortImage->ArrayIndex=i;
  810.         SwitchPortArray[i]->pPortImage->Create(NULL,WS_CHILD|SS_ICON|WS_VISIBLE|SS_NOTIFY,
  811. cr,pVlanView,IDC_MYIMAGE+1000+i);
  812.         if ((index % 2)==0)
  813. {
  814. if (SwitchPortArray[i]->PortStatus=="UP")
  815. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_gd);
  816. else
  817. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_dd); 
  818. if (SwitchPortArray[i]->trunk==true)
  819. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_gd);
  820. }
  821. else
  822. {
  823. if (SwitchPortArray[i]->PortStatus=="UP")
  824. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_gu);
  825. else
  826. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_du); 
  827. if (SwitchPortArray[i]->trunk==true)
  828. SwitchPortArray[i]->pPortImage->SetIcon(hIcon_gu);
  829. }
  830. //SwitchPortArray[i]->pPortImage->SetIcon(hIcon);
  831.         SwitchPortArray[i]->pPortImage->port=true;
  832.         SwitchPortArray[i]->pPortImage->MyPos.x=x+16;
  833.         SwitchPortArray[i]->pPortImage->MyPos.y=y+16; 
  834. if (SwitchPortArray[i]->PortStatus=="UP")
  835. {
  836. if (SwitchPortArray[i]->HostAdd.GetSize()>=1)
  837. {
  838. if ((index % 2)==0)
  839. y+=60;
  840. else
  841. y-=60;
  842. CRect cr1(x,y,16,16);
  843. SwitchPortArray[i]->pHostImage=new CMyImage();
  844. SwitchPortArray[i]->pHostImage->Create(NULL,WS_CHILD|SS_ICON|WS_VISIBLE|SS_NOTIFY,
  845.                    cr1,pVlanView,IDC_MYIMAGE+2000+i);
  846. SwitchPortArray[i]->pHostImage->port=true;
  847. SwitchPortArray[i]->pHostImage->MyPos.x=x+16;
  848. SwitchPortArray[i]->pHostImage->MyPos.y=y+16;
  849. if (SwitchPortArray[i]->HostAdd.GetSize()==1)
  850. SwitchPortArray[i]->pHostImage->SetIcon(hComputer);
  851. else
  852. SwitchPortArray[i]->pHostImage->SetIcon(hNet);
  853. }
  854. }
  855. }
  856. pVlanView->paint=true;
  857. pVlanView->RedrawWindow();
  858. }
  859. void CMainFrame::OnAddMap() 
  860. {
  861. CInput input;
  862. CString ip,community;
  863. if(input.DoModal()==IDOK)
  864. {
  865. ip=input.m_ip;
  866. community=input.m_community;
  867. }
  868. m_snmp.clear();
  869. CString TempOid="1.3.6.1.2.1.3.1.1.2";
  870. m_snmp.GetTree(ip,community,TempOid);
  871. //物理地址;
  872. TempOid="1.3.6.1.2.1.3.1.1.3";
  873. m_snmp.GetTree(ip,community,TempOid);
  874. //网络地址;
  875. int row=m_snmp.GetCount()/2;
  876. for (int i=0;i<row;i++)
  877. {
  878.         ip=m_snmp.GetValue(i);
  879. ip=ip.Left(17);
  880. ip.TrimLeft();
  881. ip.TrimRight();
  882. M2I.SetAt(ip,m_snmp.GetValue(i+row));
  883. }
  884. if (row!=0)
  885. MessageBox("操作成功!");
  886. }
  887. void CMainFrame::OnValnTopo() 
  888. {
  889.     HRoot=pListView->m_vlan.GetRootItem();
  890. if (HRoot==NULL) return;
  891.     HCurrent=pListView->m_vlan.GetSelectedItem();
  892. if ((HCurrent==NULL)||(HRoot!=pListView->m_vlan.GetParentItem(HCurrent)))
  893. {
  894. MessageBox("请在Tree中选择一个VLAN!");
  895. return;
  896.     }
  897.     pVlanData=(Vlan *)pListView->m_vlan.GetItemData(HCurrent);
  898.     pNetMapView->RedrawWindow();
  899. CString VlanId=pVlanData->Id;
  900. CString r;
  901. NodeData *p1;
  902. CClientDC dc(pNetMapView);
  903. CBrush MyBrush;
  904. CBrush * pOldBrush;
  905. MyBrush.CreateSolidBrush(RGB(0,255,0));
  906. pOldBrush=dc.SelectObject(&MyBrush);
  907. CString TempOid="1.3.6.1.4.1.9.9.68.1.2.2.1.2";
  908. CString community="public";
  909. for (int i=0;i<NodeArray.GetSize();i++)
  910. {
  911. p1=(NodeData *)(pListView->m_map.GetItemData(NodeArray[i]));
  912. if (p1->router==true)
  913. continue;
  914. m_temp.clear();
  915. TempMap.RemoveAll();
  916. m_temp.GetTree(p1->ip,community,TempOid);
  917. for (int j=0;j<m_temp.GetCount();j++)
  918. TempMap.SetAt(m_temp.GetValue(j),m_temp.GetOid(j));
  919. if (TempMap.Lookup(VlanId,r)!=0)
  920. {
  921. int x1=p1->pImage->MyPos.x-22;
  922. int y1=p1->pImage->MyPos.y-22;
  923. CRect rc(x1,y1,x1+20,y1+20);
  924. dc.Ellipse(rc);
  925. }
  926. }
  927. dc.SelectObject(pOldBrush);
  928. }
  929. void CMainFrame::OnAddVlan() 
  930. {
  931.     NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  932. if (p1->router==true) 
  933. {
  934. MessageBox("该设备不是交换机!");
  935. return;
  936. }
  937.     CString community="private";
  938. CString id,name;
  939. CString Oid;
  940. CAddVlan dlg;
  941. if (dlg.DoModal()==IDOK)
  942. {
  943. id=dlg.m_vid;
  944. name=dlg.m_vname;
  945. }
  946. int said=100000+atoi((LPCTSTR)id);
  947. CString S;
  948. S.Format("%d",said);
  949. //根据vlan ID产生vlan的SAID;
  950. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  951. m_snmp.Set(p1->ip,community,Oid,"2",0);        
  952. //1设置vtpVlanEditOperation,将当前vlan信息拷贝到编辑缓冲区;
  953. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.3.1";
  954. m_snmp.Set(p1->ip,community,Oid,"me",1); 
  955. //2设置"owner"字符串;
  956. Oid="1.3.6.1.4.1.9.9.46.1.4.2.1.11.1."+id;
  957. m_snmp.Set(p1->ip,community,Oid,"4",0); 
  958. //3设置vtpVlanEditRowStatus值为CreatandGo,创建行;
  959. Oid="1.3.6.1.4.1.9.9.46.1.4.2.1.3.1."+id;
  960. m_snmp.Set(p1->ip,community,Oid,"1",0); 
  961. //4设置vlan类型;
  962. Oid="1.3.6.1.4.1.9.9.46.1.4.2.1.4.1."+id;
  963. m_snmp.Set(p1->ip,community,Oid,name,1); 
  964. //5设置vlan名字;
  965. Oid="1.3.6.1.4.1.9.9.46.1.4.2.1.6.1."+id;
  966. m_snmp.Set(p1->ip,community,Oid,S,1); 
  967. //6设置vlan SAID串;
  968. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  969. m_snmp.Set(p1->ip,community,Oid,"3",0); 
  970. //7设置vtpVlanEditOperation,将当前编辑缓冲区的信息应用到系统中;
  971. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  972. m_snmp.Set(p1->ip,community,Oid,"4",0); 
  973. //释放编辑缓冲区;
  974. MessageBox("OK");
  975. }
  976. void CMainFrame::OnDeleteVlan() 
  977. {
  978.     NodeData * p1=(NodeData *)(pListView->m_map.GetItemData(HSelect));
  979. CString Oid,id,name;
  980. CString community="private";
  981. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  982. CAddVlan dlg;
  983. if (dlg.DoModal()==IDOK)
  984. name=dlg.m_vname;
  985. Name2Id.Lookup(name,id);
  986. m_snmp.Set(p1->ip,community,Oid,"2",0);        
  987. //1设置vtpVlanEditOperation,将当前vlan信息拷贝到编辑缓冲区;
  988. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.3.1";
  989. m_snmp.Set(p1->ip,community,Oid,"me",1); 
  990. //2设置"owner"字符串;
  991. Oid="1.3.6.1.4.1.9.9.46.1.4.2.1.11.1."+id;
  992. m_snmp.Set(p1->ip,community,Oid,"6",0); 
  993. //3设置vtpVlanEditRowStatus值为Destory,删除行;
  994. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  995. m_snmp.Set(p1->ip,community,Oid,"3",0); 
  996. //7设置vtpVlanEditOperation,将当前编辑缓冲区的信息应用到系统中;
  997. Oid="1.3.6.1.4.1.9.9.46.1.4.1.1.1.1";
  998. m_snmp.Set(p1->ip,community,Oid,"4",0); 
  999. //释放编辑缓冲区;
  1000. MessageBox("OK");
  1001. }
  1002. void CMainFrame::OnPortMore() 
  1003. {
  1004. if (pListView->m_vlan.GetRootItem()==NULL)
  1005. return;
  1006. CString str="";
  1007. CString Temp="";
  1008. SwitchPort *pPort;
  1009. pPort=SwitchPortArray[SeletedIndex];
  1010. str+="端口名称:"+pPort->PortName+"rn";
  1011. if (pPort->trunk==true)
  1012. {
  1013. for (int i=0;i<pPort->Vlans.GetLength();i++)
  1014. {
  1015. if (pPort->Vlans[i]=='0')
  1016. Temp+=FindVlan(i)+"  ";
  1017. }
  1018. str+="端口类型:TRUNK端口rn";
  1019. str+="封装类型:"+pPort->PortStatus+"rn";
  1020. str+="不允许的VLAN:"+Temp;
  1021. }
  1022. else
  1023. {
  1024. str+="端口类型:一般端口rn";
  1025. str+="端口状态:"+pPort->PortStatus+"rn";
  1026. for(int j=0;j<pPort->HostAdd.GetSize();j++)
  1027. Temp+=pPort->HostAdd[j].hIp+"  ";
  1028. str+="主机IP:"+Temp+"rn";
  1029. Temp="";
  1030. for(j=0;j<pPort->HostAdd.GetSize();j++)
  1031. Temp+=pPort->HostAdd[j].hAdd+"  ";
  1032. str+="主机MAC:"+Temp+"rn";
  1033. }
  1034. MessageBox(str,"端口信息");
  1035. }
  1036. void CMainFrame::OnToVlan() 
  1037. {
  1038. SwitchPort *pPort;
  1039. pPort=SwitchPortArray[SeletedIndex];
  1040. if (pPort->trunk)
  1041. {
  1042. MessageBox("该端口不能赋给一个VLAN!");
  1043. return;
  1044. }
  1045. CString community="private";
  1046. CString name,id;
  1047. CString Oid;
  1048. CAddVlan dlg;
  1049. if (dlg.DoModal()==IDOK)
  1050. name=dlg.m_vname;
  1051. Name2Id.Lookup(name,id);
  1052. if (id.GetLength()==0) return;
  1053. Oid="1.3.6.1.4.1.9.9.68.1.2.2.1.2."+pPort->PortIndex;
  1054. m_snmp.Set(pPort->SwitchIP,community,Oid,id,0);
  1055. CString r;
  1056. m_snmp.GetOne(pPort->SwitchIP,community,Oid,r);
  1057. if (r==id)
  1058. MessageBox("操作成功!");
  1059. }