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

SNMP编程

开发平台:

Visual C++

  1. // TrapView.cpp : implementation of the CTrapView class
  2. //
  3. #include "stdafx.h"
  4. #include "Trap.h"
  5. #include "TrapDoc.h"
  6. #include "TrapView.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CTrapView
  15. IMPLEMENT_DYNCREATE(CTrapView, CFormView)
  16. BEGIN_MESSAGE_MAP(CTrapView, CFormView)
  17. //{{AFX_MSG_MAP(CTrapView)
  18. ON_COMMAND(ID_START, OnStart)
  19. ON_COMMAND(ID_END, OnEnd)
  20. ON_COMMAND(ID_FINISH, OnFinish)
  21. ON_COMMAND(ID_CONFIG, OnConfig)
  22. ON_WM_DESTROY()
  23. //}}AFX_MSG_MAP
  24. // Standard printing commands
  25. // ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
  26. // ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
  27. // ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CTrapView construction/destruction
  31. CTrapView::CTrapView()
  32. : CFormView(CTrapView::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CTrapView)
  35. //}}AFX_DATA_INIT
  36. // TODO: add construction code here
  37.  
  38. }
  39. CTrapView::~CTrapView()
  40. {
  41. }
  42. void CTrapView::DoDataExchange(CDataExchange* pDX)
  43. {
  44. CFormView::DoDataExchange(pDX);
  45. //{{AFX_DATA_MAP(CTrapView)
  46. DDX_Control(pDX, IDC_LIST1, m_list1);
  47. DDX_Control(pDX, IDC_EDIT1, m_text);
  48. DDX_Control(pDX, IDC_TREE1, m_tree);
  49. //}}AFX_DATA_MAP
  50. }
  51. BOOL CTrapView::PreCreateWindow(CREATESTRUCT& cs)
  52. {
  53. // TODO: Modify the Window class or styles here by modifying
  54. //  the CREATESTRUCT cs
  55.     return CFormView::PreCreateWindow(cs);
  56. }
  57. void CTrapView::OnInitialUpdate()
  58. {
  59. CFormView::OnInitialUpdate();
  60. GetParentFrame()->RecalcLayout();
  61. ResizeParentToFit();
  62.  //  m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);;
  63. //pMain->pTrapView=this;
  64. TrapMessage="";
  65. m_list1.InsertColumn(0,"  类型   ",LVCFMT_LEFT,80,0);
  66. m_list1.InsertColumn(1,"  名称(DLCI)",LVCFMT_LEFT,130,1);
  67.     m_list1.InsertColumn(2,"  状态  ",LVCFMT_LEFT,70,2);
  68. m_list1.InsertColumn(3,"  辅助信息  ",LVCFMT_LEFT,300,3);
  69. m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  70.     m_tree.InsertItem("被监视设备",NULL); 
  71. m_tree.SetIndent(32);
  72. m_tree.SetItemHeight(26);
  73. // m_tree.InsertItem("aaa",m_tree.GetRootItem());
  74.     m_iImageList.Create(16, 16, TRUE,1, 0);
  75. HICON hIcon;
  76. hIcon= NULL;
  77. //0,root;
  78. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  79. MAKEINTRESOURCE(IDI_ROUTER), IMAGE_ICON, 32, 32, 0);
  80. m_iImageList.Add(hIcon);
  81. //1,closed box;
  82. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  83. MAKEINTRESOURCE(IDI_LINE), IMAGE_ICON, 16, 16, 0);
  84. m_iImageList.Add(hIcon);
  85. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  86. MAKEINTRESOURCE(IDI_DOWN), IMAGE_ICON, 16, 16, 0);
  87. m_iImageList.Add(hIcon);
  88.     m_tree.SetImageList (&m_iImageList,TVSIL_NORMAL);
  89. dlg.Create(IDD_DIALOG1);
  90.     Recive=true;
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CTrapView printing
  94. BOOL CTrapView::OnPreparePrinting(CPrintInfo* pInfo)
  95. {
  96. // default preparation
  97. return DoPreparePrinting(pInfo);
  98. }
  99. void CTrapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  100. {
  101. // TODO: add extra initialization before printing
  102. }
  103. void CTrapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  104. {
  105. // TODO: add cleanup after printing
  106. }
  107. void CTrapView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
  108. {
  109. // TODO: add customized printing code here
  110. }
  111. /////////////////////////////////////////////////////////////////////////////
  112. // CTrapView diagnostics
  113. #ifdef _DEBUG
  114. void CTrapView::AssertValid() const
  115. {
  116. CFormView::AssertValid();
  117. }
  118. void CTrapView::Dump(CDumpContext& dc) const
  119. {
  120. CFormView::Dump(dc);
  121. }
  122. CTrapDoc* CTrapView::GetDocument() // non-debug version is inline
  123. {
  124. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTrapDoc)));
  125. return (CTrapDoc*)m_pDocument;
  126. }
  127. #endif //_DEBUG
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CTrapView message handlers
  130. //回调函数,当有TRAP到达时,调用该函数进行进一步处理;
  131. void callme (int reason, Snmp *snmp, Pdu &pdu, SnmpTarget &target, void *cd)
  132. {  
  133.     CString str="";
  134. CTime time=CTime::GetCurrentTime();
  135. CString time_str=time.Format("%Y-%m-%d:%H:%M:%S");
  136. CTrapView *p;
  137. p=(CTrapView *)cd;
  138. Vb nextVb;
  139. GenAddress addr;
  140. target.get_address(addr);
  141. IpAddress from(addr);
  142. CString ipadd=from.get_printable();
  143. if (ipadd=="127.0.0.1")
  144. return;
  145. //结束监听时本机发送的TRAP退出循环,不做任何处理;
  146. Oid id,ent;
  147. pdu.get_notify_id(id);
  148. pdu.get_notify_enterprise(ent);
  149. CString TrapId=id.get_printable();
  150. //   AfxMessageBox(TrapId);
  151. CString EnterPrise=ent.get_printable();
  152. //取得TRAP的ID以及enterprise ;
  153.     //AfxMessageBox(EnterPrise);
  154. CString index,name;
  155. HTREEITEM ht;
  156. pdu.get_vb(nextVb, 0);
  157. index=nextVb.get_printable_value();
  158.     pdu.get_vb(nextVb, 1);
  159.     name=nextVb.get_printable_value();
  160. if (EnterPrise=="1.3.6.1.2.1.10.32")
  161. {
  162. for (int i=0;i<p->LineArray.GetSize();i++)
  163. {
  164. if (p->LineArray[i]->Selected)
  165. {   
  166. if (p->LineArray[i]->Name==name)
  167. {
  168. ht=p->LineArray[i]->Ht;
  169. pdu.get_vb(nextVb,2);
  170. CString ud=nextVb.get_printable_value();
  171. if (ud=="2")
  172. {
  173. p->TrapMessage+=time_str+"设备:"+ipadd+"中PVC:"+name+"目前状态为正常!";
  174. p->TrapMessage+=p->LineArray[i]->Descr+"rn";
  175. p->m_tree.SetItemImage(ht,1,1);
  176. str=str+"设备:"+ipadd+"rn";
  177. str=str+"PVC:"+name+"rn";
  178. str=str+"状态正常!";
  179. }
  180. else
  181. {
  182. p->TrapMessage+=time_str+"设备:"+ipadd+"中PVC:"+name+"目前状态为不可用!";
  183. p->TrapMessage+=p->LineArray[i]->Descr+"rn";
  184. p->m_tree.SetItemImage(ht,2,2);
  185.                     str=str+"设备:"+ipadd+"rn";
  186. str=str+"PVC:"+name+"rn";
  187. str=str+"状态不可用!";
  188. }
  189. p->m_text.SetWindowText(p->TrapMessage); 
  190.     p->dlg.m_txt.SetWindowText(str);
  191.                     p->dlg.ShowWindow(SW_SHOW);
  192. break;
  193. }
  194. }
  195. }
  196. }
  197. else
  198. {
  199.   for (int i=0;i<p->LineArray.GetSize();i++)
  200. {
  201.  if ((p->LineArray[i]->Selected)&&(p->LineArray[i]->Type=="普通接口"))
  202. {   
  203. if (p->LineArray[i]->Index==index)
  204. {
  205. ht=p->LineArray[i]->Ht;
  206. if (TrapId=="1.3.6.1.6.3.1.1.5.4")
  207. {
  208. p->TrapMessage+=time_str+"设备:"+ipadd+"中接口:"+name+"目前状态为UP!";
  209. p->TrapMessage+=p->LineArray[i]->Descr+"rn";
  210. p->m_tree.SetItemImage(ht,1,1);
  211.                      str=str+"设备:"+ipadd+"rn";
  212. str=str+"接口:"+name+"rn";
  213. str=str+"状态正常!";
  214. }
  215. if (TrapId=="1.3.6.1.6.3.1.1.5.3")
  216. {
  217. p->TrapMessage+=time_str+"设备:"+ipadd+"中接口:"+name+"目前状态为Down!";
  218. p->TrapMessage+=p->LineArray[i]->Descr+"rn";
  219. p->m_tree.SetItemImage(ht,2,2);
  220.                      str=str+"设备:"+ipadd+"rn";
  221. str=str+"接口:"+name+"rn";
  222. str=str+"状态不可用!";
  223. }
  224. p->m_text.SetWindowText(p->TrapMessage); 
  225.                     p->dlg.m_txt.SetWindowText(str);
  226. p->dlg.ShowWindow(SW_SHOW);
  227. break;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. //监听TRAP线程的处理函数,接受一个指针作为参数;
  234. UINT WorkerThreadProc(LPVOID Param)
  235.   Oid linkUp("1.3.6.1.6.3.1.1.5.4");
  236.   Oid linkDown("1.3.6.1.6.3.1.1.5.3");
  237.   CTrapView *pCV;
  238.   pCV=(CTrapView *)Param;
  239.   //将指针类型转换为CTrapView *类型指针;
  240.   int trap_port;
  241.   trap_port =162; 
  242.   //指定监听端口号;
  243.   int status; 
  244.   Snmp::socket_startup();  
  245.   Snmp snmp( status, 0);   
  246.   // 创建Snmp对象;
  247.   if ( status != SNMP_CLASS_SUCCESS)
  248.   {
  249.    AfxMessageBox("出现错误!");
  250.    return TRUE;
  251.   }
  252.    OidCollection oidc;
  253.    TargetCollection targetc;
  254.    //创建过滤TRAP的对象;
  255.    CNotifyEventQueue::set_listen_port(trap_port);
  256.    //设置端口号;
  257.    status=snmp.notify_register(oidc, targetc,callme,Param);
  258.    //注册过滤条件,回调函数,并将Param,也就是指向CTrapView
  259.    //对象的this指针,传递给回调函数,以方便在回调函数中访问
  260.    //处理CTrapView对象中的成员变量;
  261.    if (status != SNMP_CLASS_SUCCESS)
  262.    {
  263.     AfxMessageBox("出现错误!");
  264.     return TRUE;
  265.    }
  266.  while (pCV->Recive)
  267.  snmp.eventListHolder->SNMPProcessEvents();
  268.  //进入SNMPProcessEvents()函数,等待TRAP触发回调用函数;
  269.  Snmp::socket_cleanup();  
  270. AfxMessageBox("停止监视线路!");
  271. return TRUE;
  272. }
  273. void CTrapView::OnStart() 
  274. if (m_tree.GetCount()<3)
  275. {
  276. MessageBox("先选择线路!");
  277. return;
  278. }
  279.  m_list1.DeleteAllItems();
  280. if (Recive==false)
  281.   Recive=true;
  282.  AfxBeginThread(WorkerThreadProc,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
  283.  //创建一个新线程,用来在指定端口监听TRAP;将this指针作为参数传递给新线程;
  284. CMainFrame *pF=(CMainFrame *)AfxGetMainWnd();
  285. pF->m_wndStatusBar.SetPaneText(0,"开始监视......");
  286. // MessageBox("开始监听......");
  287. }
  288. void CTrapView::OnEnd() 
  289. {
  290. if (Recive==true)
  291.   Recive=false;
  292.   Snmp::socket_startup();  
  293.   UdpAddress address("127.0.0.1:162");      
  294.     int status;
  295.    Snmp snmp(status, "0.0.0.0") ;
  296.    Pdu pdu;                               
  297.    pdu.set_notify_id("1.3.6.1");               
  298.    pdu.set_notify_enterprise( "test");     
  299.    CTarget ctarget(address);             
  300.    ctarget.set_version( version1);        
  301.    ctarget.set_readcommunity("public"); 
  302.    SnmpTarget *target=&ctarget;
  303.    status = snmp.trap(pdu,*target);
  304.    Snmp::socket_cleanup();  
  305.    //发送一个TRAP,结束监听状态;
  306. }
  307. void CTrapView::OnFinish() 
  308. {
  309.  HTREEITEM HRoot,HCurrent,Htemp;
  310.   POSITION pos;
  311.   pos=m_list1.GetFirstSelectedItemPosition();
  312.   if (pos==NULL)
  313.   {
  314.   MessageBox("没有选择要监视的线路!");
  315.   return;
  316.   }
  317.  HRoot=m_tree.GetRootItem();
  318.  HCurrent=m_tree.InsertItem(TempArray[0]->Ip,0,0,HRoot);
  319.   int nItem;
  320.   while (pos)
  321.    {
  322.       nItem =m_list1.GetNextSelectedItem(pos);
  323.   if ((nItem)<=TempArray.GetSize())
  324.   {
  325.    TempArray[nItem]->Selected=true;
  326.     
  327.        Htemp=m_tree.InsertItem(TempArray[nItem]->Name,1,1,HCurrent); 
  328.    if (TempArray[nItem]->State=="Down")
  329.    m_tree.SetItemImage(Htemp,2,2);
  330.    TempArray[nItem]->Ht=Htemp;
  331.   }
  332.   }
  333.   m_tree.Expand(HRoot,TVE_EXPAND);
  334.   for (int i=0;i<TempArray.GetSize();i++)
  335.   {
  336.    if (TempArray[i]->Selected==true)
  337.    LineArray.Add(TempArray[i]);
  338.     else
  339.        delete TempArray[i];
  340.   }
  341. }
  342. void CTrapView::OnConfig() 
  343. {
  344. //number=LineArray.GetSize();
  345. TempArray.RemoveAll();
  346. CString ip,BaseOid,community;
  347. CScan dlg;
  348. if (dlg.DoModal()==IDOK)
  349. {
  350. ip=dlg.ip1;
  351. community=dlg.m_community;
  352. }
  353. m_snmp.clear();
  354. BaseOid="1.3.6.1.2.1.2.2.1.1";
  355. m_snmp.GetTree(ip,community,BaseOid);
  356. if (m_snmp.GetCount()==0)
  357. return;
  358. BaseOid="1.3.6.1.2.1.2.2.1.2";
  359. m_snmp.GetTree(ip,community,BaseOid);
  360. BaseOid="1.3.6.1.2.1.2.2.1.8";
  361. m_snmp.GetTree(ip,community,BaseOid);
  362. int row=m_snmp.GetCount()/3;
  363. for (int i=0;i<row;i++)
  364. {
  365. pLine=new Line;
  366.         pLine->Type="普通接口";
  367. pLine->Selected=false;
  368. pLine->Index=m_snmp.GetValue(i);
  369. pLine->Name=m_snmp.GetValue(i+row);
  370. if (m_snmp.GetValue(i+2*row)=="1")
  371. pLine->State="UP";
  372. else  pLine->State="Down";
  373. pLine->Ht=NULL;
  374. pLine->Descr="";
  375. pLine->Ip=ip;
  376. TempArray.Add(pLine);
  377. }
  378. m_snmp.clear();
  379. BaseOid="1.3.6.1.2.1.4.20.1.2";
  380. m_snmp.GetTree(ip,community,BaseOid);
  381. CString temp;
  382. for (i=0;i<m_snmp.GetCount();i++)
  383. {
  384.     for (int j=0;j<TempArray.GetSize();j++)
  385. if (m_snmp.GetValue(i)==TempArray[j]->Index)
  386. {
  387. temp=m_snmp.GetOid(i);
  388. temp=temp.Right(temp.GetLength()-21);
  389. TempArray[j]->Descr="IP:"+temp;
  390. break;
  391. }
  392. }
  393. //for (int j=number;j<LineArray.GetSize();j++)
  394.     for (int j=0;j<TempArray.GetSize();j++)
  395. {
  396. BaseOid="1.3.6.1.2.1.31.1.1.1.18."+TempArray[j]->Index;
  397. m_snmp.GetOne(ip,community,BaseOid,temp);
  398. TempArray[j]->Descr+=" 备注:"+temp;
  399. }
  400. //获取网络接口的信息并保存;
  401. m_snmp.clear();
  402. BaseOid="1.3.6.1.2.1.10.32.2.1.1";
  403. m_snmp.GetTree(ip,community,BaseOid);
  404. BaseOid="1.3.6.1.2.1.10.32.2.1.2";
  405. m_snmp.GetTree(ip,community,BaseOid);
  406. BaseOid="1.3.6.1.2.1.10.32.2.1.3";
  407. m_snmp.GetTree(ip,community,BaseOid);
  408. row=m_snmp.GetCount()/3;
  409. for (i=0;i<row;i++)
  410. {
  411. pLine=new Line;
  412. pLine->Selected=false;
  413. pLine->Type="帧中继PVC";
  414. pLine->Ip=ip;
  415. pLine->Ht=NULL;
  416. pLine->Index=m_snmp.GetValue(i);
  417. pLine->Name=m_snmp.GetValue(i+row);
  418. if (m_snmp.GetValue(i+2*row)=="2")
  419. pLine->State="UP";
  420. else  pLine->State="Down";
  421. BaseOid="1.3.6.1.4.1.9.9.49.1.2.2.1.2."+pLine->Index+"."+pLine->Name;
  422. m_snmp.GetOne(ip,community,BaseOid,temp);
  423. if ("2"==temp)
  424. {
  425. CString rv;
  426. BaseOid="1.3.6.1.4.1.9.9.49.1.2.2.1.3."+pLine->Index+"."+pLine->Name;
  427. m_snmp.GetOne(ip,community,BaseOid,rv);
  428. BaseOid="1.3.6.1.2.1.31.1.1.1.18."+rv;
  429. m_snmp.GetOne(ip,community,BaseOid,rv);
  430. pLine->Descr=rv;
  431. }
  432. else
  433. {
  434. CString rv;
  435. BaseOid="1.3.6.1.4.1.9.9.49.1.3.1.1.3."+pLine->Index+"."+pLine->Name;
  436. m_snmp.GetOne(ip,community,BaseOid,rv);
  437. pLine->Descr=rv;
  438. }
  439. //LineArray.Add(pLine);
  440. TempArray.Add(pLine);
  441.     
  442. }
  443. // if (pTrapView->m_list1.GetItemCount()>0)
  444.     m_list1.DeleteAllItems();
  445. for (i=0;i<TempArray.GetSize();i++)
  446. {
  447.      m_list1.InsertItem(i,TempArray[i]->Type);
  448.  m_list1.SetItemText(i,1,TempArray[i]->Name);
  449.      m_list1.SetItemText(i,2,TempArray[i]->State);
  450.      m_list1.SetItemText(i,3,TempArray[i]->Descr);
  451. }
  452. }
  453. void CTrapView::OnDestroy() 
  454. {
  455. CFormView::OnDestroy();
  456. for (int i=0;i<LineArray.GetSize();i++)
  457. {
  458. delete LineArray[i];
  459. }
  460. }