func.cpp
上传用户:qiye66692
上传日期:2022-04-25
资源大小:72k
文件大小:5k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".func.h"
  3. #include ".mib.h"
  4. #include ".Snmp.h"
  5. #include ".msg.h"
  6. #include ".subNetDlg.h"
  7. #include ".Ping.h"
  8. #include ".Host.h"
  9. #include ".Router.h"
  10. CString GetLocalIP()
  11. {
  12. char name[255];
  13. PHOSTENT hostinfo;//use "afxsock.h"
  14. CString strIP;
  15. //returns the standard host name for the local computer
  16. if (gethostname(name, sizeof(name)) == 0)
  17. {
  18. //gets host data corresponding to a host name
  19. hostinfo = gethostbyname( name );
  20. if ( hostinfo != NULL )
  21. {
  22. strIP = inet_ntoa(* (struct in_addr *) *(hostinfo->h_addr_list) );
  23. }
  24. }
  25. return strIP;
  26. }
  27. bool GetRouterInfo( LPCSTR ip, LPCSTR community, CRouter* pRouter) 
  28. {
  29. BOOL status;
  30. CSnmp snmp( ip, community ); //把ip和团体名传入,创建Csnmp类的实例
  31. status = snmp.Prepare(); //调snmp中的Prepare,完成SNMP的加载,会话的建立等
  32. if( status == FALSE )
  33. {
  34. pRouter->m_strName = "unknown";
  35. return FALSE;
  36. }
  37. CStringArray reqList; //请求列表
  38. //查路由器的ip地址表
  39. reqList.Add( ipAdEntAddr ); //在Mib.h中可看到ipAdEntAddr(ip)和
  40. reqList.Add( ipAdEntNetMask ); //ipAdEntNetMask(掩码)对应的objectID
  41. //根据请求列表查路由表信息,放到pRouter里(即添加到路由器链表尾部)
  42. status = snmp.GetTable( &reqList, pRouter );
  43. if( status == FALSE )
  44. return FALSE;
  45. //查系统表
  46. reqList.RemoveAll();
  47. reqList.Add( sysDescr );
  48. reqList.Add( sysUpTime );
  49. reqList.Add( sysName );
  50. status = snmp.GetTable( &reqList, pRouter );
  51. if( status == FALSE )
  52. return FALSE;
  53. //查路由表
  54. reqList.RemoveAll();
  55. reqList.Add( ipRouteDest );
  56. reqList.Add( ipRouteNextHop );
  57. reqList.Add( ipRouteMask );
  58. status = snmp.GetTable( &reqList, pRouter );
  59. if( status == FALSE )
  60. return FALSE;
  61. snmp.Close();
  62. return TRUE;
  63. }
  64. UINT SearchRouter( LPVOID pParam )
  65. {
  66. CNetFinderDlg* dlg = (CNetFinderDlg*)pParam;
  67. CString ip, community;
  68. ip = dlg->m_ip;
  69. community = dlg->m_community;
  70. DepthFirstSearch( dlg, ip, community, 1 ); //以对话框中的变量为参数传入,
  71. //进行深度优先搜索
  72. dlg->SendMessage( MSG_SEARCH_ROUTER_END, 0, 0 );//search结束后发结束消息
  73. return 0;
  74. }
  75. void DepthFirstSearch( CNetFinderDlg* dlg, CString ip, CString community, UINT depth )
  76. {
  77. BOOL status;
  78. CRouter router;
  79. if( depth > dlg->m_depth ) //根据对话框中搜索深度的设置,决定递归是否继续
  80. {
  81. return;
  82. }
  83. //先调获取路由信息的函数(根据ip,团体名,路由器链表尾指针)
  84. status = GetRouterInfo( ip, community, dlg->pTailRouter );
  85. if( status == FALSE )
  86. {
  87. dlg->SendMessage( MSG_FOUND_ROUTER, depth, 0 );
  88. WaitForSingleObject(dlg->m_router_added, INFINITE );
  89. dlg->m_router_added.ResetEvent();
  90. return;
  91. }
  92. else
  93. {
  94. dlg->SendMessage( MSG_FOUND_ROUTER, depth, 0 );
  95. WaitForSingleObject(dlg->m_router_added, INFINITE );
  96. dlg->m_router_added.ResetEvent();
  97. for( int i = 0; i < dlg->pCurrRouter->m_NextHopArray.GetSize(); i ++ )
  98. {
  99. for( int j = 0; j < dlg->routerArray.GetSize()-1; j ++ )
  100. {
  101. CRouter* temp;
  102. temp = (CRouter*)dlg->routerArray.GetAt(j);
  103. for( int k = 0; k < temp->m_NextHopArray.GetSize(); k ++ )
  104. {
  105. if( temp->m_NextHopArray.GetAt(k) == dlg->pCurrRouter->m_NextHopArray.GetAt(i) )
  106. {
  107. return;
  108. }
  109. }
  110. }
  111. CString tempIp = dlg->pCurrRouter->m_NextHopArray.GetAt(i);
  112. if( (tempIp.Left(3)!="127") && (tempIp.Left(3)!="255") && (tempIp.Left(1)!="0") && (tempIp.Left(3)!="224") )
  113. {
  114. DepthFirstSearch( dlg, tempIp, community, depth+1 );
  115. }
  116. }
  117. }
  118. }
  119. UINT PingHost( LPVOID pParam )
  120. {
  121. CSubNetDlg* dlg = (CSubNetDlg*)pParam;
  122. HWND hWnd = dlg->GetSafeHwnd(); 
  123. CPing pingHost;
  124. DWORD dNetMask = inet_addr(dlg->m_mask);
  125. DWORD dNetAddr = inet_addr(dlg->m_ip);
  126. dNetMask = ntohl(dNetMask);
  127. dNetAddr = ntohl(dNetAddr);
  128. DWORD dSubNet = dNetAddr & dNetMask;
  129. BYTE *byte = (BYTE *)&dSubNet;
  130. DWORD count = ~dNetMask; //得到子网中的主机数
  131. if (count > 255)
  132. count = 255; //only process a small subnet to save time
  133. CString strIP;
  134. for ( BYTE i = 1; i < count; i++)
  135. {
  136. if( ::WaitForSingleObject(dlg->m_StopEvent.m_hObject, 0) == WAIT_OBJECT_0 )
  137. {
  138. dlg->m_ExitEvent.SetEvent();
  139. return 1;
  140. }
  141. byte[0] += 1 ;
  142. strIP.Format("%d.%d.%d.%d",
  143. (int)byte[3], (int)byte[2], (int)byte[1], (int)byte[0]);
  144. if( pingHost.ping(strIP) == TRUE )
  145. {
  146. CHost host;
  147. dlg->m_host.m_strHostIp = strIP;
  148. dlg->m_host.m_strHostName = "";
  149. dlg->m_host.m_strHostDescr = "";
  150. dlg->m_host.m_strHostUpTime = "";
  151. CSnmp snmp(strIP, dlg->m_community);
  152. if(snmp.Prepare()) {
  153. CStringArray reqList; //请求列表
  154. reqList.Add( sysDescr );
  155. reqList.Add( sysUpTime );
  156. reqList.Add( sysName );
  157. CRouter router;
  158. if(snmp.GetTable(&reqList, &router)) {//如果支持SNMP协议
  159. dlg->m_host.m_strHostName = router.m_strName;
  160. dlg->m_host.m_strHostDescr = router.m_strDescr;
  161. dlg->m_host.m_strHostUpTime = router.m_strUpTime;
  162. }
  163. }
  164. ::SendMessage( hWnd, MSG_FOUND_HOST, i, 0 );
  165. }
  166. dlg->m_progress.SetPos(i);
  167. }
  168. //complete
  169. dlg->bInSearching = FALSE;
  170. dlg->MessageBox(_T("搜索完毕!"));
  171. dlg->GetDlgItem(IDC_SEARCH_BUTTON)->SetWindowText("开始搜索");
  172. dlg->m_StopEvent.SetEvent();
  173. return 0;
  174. }