ScanLanComputerDlg.cpp
上传用户:tskangjie
上传日期:2022-07-13
资源大小:39k
文件大小:12k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // ScanLanComputerDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ScanLanComputer.h"
  5. #include "ScanLanComputerDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define DESTPORT 137  //ScanLanComputer name port
  12. #define MYPORT 4321
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CScanLanComputerDlg dialog
  15. CScanLanComputerDlg* pDlg;
  16. BYTE bs[50] = {0x0,0x00,0x0,0x10,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x43,0x4b,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x0,0x0,0x21,0x0,0x1};
  17. unsigned char B1[4],B2[4];
  18. HANDLE wait_handle;
  19. CString strOldIP = "";
  20. bool bExit = false;
  21. int i;
  22. //------------------------------------------------------------------
  23. CScanLanComputerDlg::CScanLanComputerDlg(CWnd* pParent /*=NULL*/)
  24. : CDialog(CScanLanComputerDlg::IDD, pParent)
  25. {
  26. //{{AFX_DATA_INIT(CScanLanComputerDlg)
  27. // NOTE: the ClassWizard will add member initialization here
  28. //}}AFX_DATA_INIT
  29. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  30. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  31. pDlg = this;
  32. if ( !m_UDPSocket.Create(MYPORT,SOCK_DGRAM) )
  33. {
  34. AfxMessageBox(_T("Failed to create socket!"));
  35. }
  36. }
  37. void CScanLanComputerDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CScanLanComputerDlg)
  41. DDX_Control(pDX, IDC_LIST_IP_ADDRESS, m_ListBoxIP);
  42. DDX_Control(pDX, IDC_IPADDRESS2, m_IPEdit2);
  43. DDX_Control(pDX, IDC_LIST_COMPUTER_INFO, m_ListCtrlComputerInfo);
  44. DDX_Control(pDX, IDC_IPADDRESS1, m_IPEdit1);
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CScanLanComputerDlg, CDialog)
  48. //{{AFX_MSG_MAP(CScanLanComputerDlg)
  49. ON_WM_PAINT()
  50. ON_WM_QUERYDRAGICON()
  51. ON_BN_CLICKED(IDC_BTN_SEND, OnBtnStart)
  52. ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS1, OnFieldchangedIpaddress1)
  53. ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
  54. ON_BN_CLICKED(IDC_BTN_SAVE, OnBtnSave)
  55. ON_NOTIFY(NM_DBLCLK, IDC_LIST3, OnDblclkListView)
  56. ON_BN_CLICKED(IDC_BUTTON_CANCEL, OnButtonCancel)
  57. ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CScanLanComputerDlg message handlers
  62. BOOL CScanLanComputerDlg::OnInitDialog()
  63. {
  64. CDialog::OnInitDialog();
  65. // Set the icon for this dialog.  The framework does this automatically
  66. //  when the application's main window is not a dialog
  67. SetIcon(m_hIcon, TRUE); // Set big icon
  68. SetIcon(m_hIcon, FALSE); // Set small icon
  69. // Set IP Address segment.
  70. m_IPEdit1.SetAddress( 172, 25, 68, 1 );
  71. m_IPEdit2.SetAddress( 172, 25, 68,  255 );
  72. // Create event.
  73. wait_handle = CreateEvent( NULL,true,false,_T("receive data") );
  74. // Disable exit thread button.
  75. GetDlgItem( IDC_BTN_EXIT )->EnableWindow( FALSE );
  76. // Initialize list control. 
  77.     DWORD dwStyle = GetWindowLong( m_ListCtrlComputerInfo.GetSafeHwnd(), GWL_STYLE );
  78. dwStyle &= ~LVS_TYPEMASK;
  79. dwStyle |= LVS_REPORT;
  80. SetWindowLong( m_ListCtrlComputerInfo.GetSafeHwnd(), GWL_STYLE, dwStyle );
  81.     m_ListCtrlComputerInfo.InsertColumn( 0, _T("MAC地址"), LVCFMT_LEFT, 150 );
  82. m_ListCtrlComputerInfo.InsertColumn( 0, _T("用户"), LVCFMT_LEFT, 160 );
  83. m_ListCtrlComputerInfo.InsertColumn( 0, _T("主机"), LVCFMT_LEFT, 120 );
  84. m_ListCtrlComputerInfo.InsertColumn( 0, _T("工作组"), LVCFMT_LEFT, 120 );
  85. m_ListCtrlComputerInfo.InsertColumn( 0, _T("IP地址"), LVCFMT_LEFT, 100 );
  86.     
  87. m_ListCtrlComputerInfo.SetExtendedStyle( LVS_EX_GRIDLINES );
  88.     ::SendMessage( m_ListCtrlComputerInfo.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
  89.       LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
  90. return TRUE;  // return TRUE  unless you set the focus to a control
  91. }
  92. // If you add a minimize button to your dialog, you will need the code below
  93. //  to draw the icon.  For MFC applications using the document/view model,
  94. //  this is automatically done for you by the framework.
  95. void CScanLanComputerDlg::OnPaint() 
  96. {
  97. if (IsIconic())
  98. {
  99. CPaintDC dc(this); // device context for painting
  100. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  101. // Center icon in client rectangle
  102. int cxIcon = GetSystemMetrics(SM_CXICON);
  103. int cyIcon = GetSystemMetrics(SM_CYICON);
  104. CRect rect;
  105. GetClientRect(&rect);
  106. int x = (rect.Width() - cxIcon + 1) / 2;
  107. int y = (rect.Height() - cyIcon + 1) / 2;
  108. // Draw the icon
  109. dc.DrawIcon(x, y, m_hIcon);
  110. }
  111. else
  112. {
  113. CDialog::OnPaint();
  114. }
  115. }
  116. // The system calls this to obtain the cursor to display while the user drags
  117. //  the minimized window.
  118. HCURSOR CScanLanComputerDlg::OnQueryDragIcon()
  119. {
  120. return (HCURSOR) m_hIcon;
  121. }
  122. // ScanLanComputer线程
  123. UINT ScanLanComputerThread(LPVOID param)
  124. {
  125. do
  126. {
  127. if ( bExit )
  128. {
  129. AfxMessageBox(_T("暂时停止查找网络邻居!"));
  130. pDlg->GetDlgItem( IDC_BTN_SEND )->EnableWindow( TRUE );
  131. pDlg->GetDlgItem( IDC_IPADDRESS1 )->EnableWindow( TRUE );
  132. pDlg->GetDlgItem( IDC_IPADDRESS2 )->EnableWindow( TRUE );
  133. pDlg->GetDlgItem( IDC_BTN_EXIT )->EnableWindow( FALSE );
  134. bExit = false;
  135. return 1;
  136. }
  137. pDlg->m_strIP.Format( "%d.%d.%d.%d", B1[0], B1[1], B1[2], B1[3] );
  138. pDlg->m_ListBoxIP.InsertString( 0, pDlg->m_strIP );
  139. if ( B1[3] != 0 && B1[2] != 0 )
  140. pDlg->m_UDPSocket.SendTo( (void*)bs, 50, DESTPORT, pDlg->m_strIP, 0 );
  141. if ( B1[2] <= B2[2] )
  142. {
  143.    if( B1[3] < B2[3] ) B1[3]++;
  144.    else if( B1[2] < B2[2] && B1[3] < 255 )B1[3]++;
  145.    else if( B1[2] < B2[2] && B1[3] == 255 )
  146.    {
  147.    B1[3] = 0;
  148.    B1[2]++;
  149.    }
  150. }
  151. else break;
  152. if( B1[3] >= B2[3] && B1[2] >= B2[2] ) break;
  153. } while( B1[2] <= 255 && B1[3] <= 255 );
  154. pDlg->m_ListBoxIP.InsertString( 0,_T("-----查找网络邻居结束!-----"));
  155. pDlg->GetDlgItem( IDC_BTN_SEND )->EnableWindow( TRUE );
  156. pDlg->GetDlgItem( IDC_IPADDRESS1 )->EnableWindow( TRUE );
  157. pDlg->GetDlgItem( IDC_IPADDRESS2 )->EnableWindow( TRUE );
  158. pDlg->GetDlgItem( IDC_BTN_EXIT )->EnableWindow( FALSE );
  159. pDlg->GetDlgItem( IDC_BUTTON_CLEAR )->EnableWindow( TRUE );
  160. return 0;
  161. }
  162. void CScanLanComputerDlg::OnBtnStart() 
  163. {
  164. GetDlgItem( IDC_BUTTON_CLEAR )->EnableWindow( FALSE );
  165. m_IPEdit1.GetAddress( B1[0], B1[1], B1[2], B1[3] );
  166. m_IPEdit2.GetAddress( B2[0], B2[1], B2[2], B2[3] );
  167. // Check data.
  168. if( B2[2] < B1[2] )
  169. {
  170. AfxMessageBox( _T("终止地址应大于起始地址") ); 
  171. return;
  172. }
  173. else if( B2[2] == B1[2] && B2[3] < B1[3] )
  174. {
  175. AfxMessageBox( _T("终止地址应大于起始地址") ); 
  176. return;
  177. }
  178. else
  179. {
  180. // Do nothing.
  181. }
  182. if( B2[0] != B1[0] || B2[1] != B1[1] )
  183. {
  184. AfxMessageBox( _T("不支持A类或B类网") ); 
  185. return;
  186. }
  187.  
  188. GetDlgItem( IDC_BTN_SEND )->EnableWindow( false );
  189. GetDlgItem( IDC_IPADDRESS1 )->EnableWindow( false );
  190. GetDlgItem( IDC_IPADDRESS2 )->EnableWindow( false );
  191. GetDlgItem( IDC_BTN_EXIT )->EnableWindow( true );
  192. // 启动线程
  193. AfxBeginThread( ScanLanComputerThread, this->GetSafeHwnd(), THREAD_PRIORITY_NORMAL );
  194. }
  195. void CScanLanComputerDlg::OnReceive()
  196. {
  197. BYTE Buf[500];
  198. CString str,strIP,strHost,strHex,strMac,Host,Group,User;
  199. UINT dport;
  200. m_UDPSocket.ReceiveFrom( Buf,500,strIP,dport,0 );
  201. if( strIP == (char)NULL || strIP == strOldIP ) return;
  202. strOldIP = strIP;
  203. int index = m_ListCtrlComputerInfo.InsertItem( 0,strIP );
  204. strHost = _T("");
  205. strHex = _T("");
  206. User = _T("?");
  207. Host = _T("\");
  208. int tem = 0,num = 0;
  209. bool bAdd = true;
  210. for ( i = 57; i < 500; i++ ) 
  211. {
  212. if ( Buf[i] == 0xcc ) break; 
  213. if ( bAdd )
  214. {
  215. str.Format( _T("%c"),Buf[i] );
  216. if( Buf[i] >= ' ' ) strHost += str;
  217. str.Format( _T("%02X-"),Buf[i] );
  218. strHex += str;
  219. }
  220. if ( (++tem)%18 == 0 )
  221. {
  222.             bAdd = true; 
  223. strHost.TrimRight( (char)NULL );
  224. if ( strHost == _T("") )
  225. {
  226.     strMac.Delete( 17,strMac.GetLength() - 17 );
  227. m_ListCtrlComputerInfo.SetItem( index,4,LVIF_TEXT,strMac, 0, 0, 0,0 );
  228. break;
  229. }
  230. if ( num == 0 && strHost != _T("") )
  231. {
  232. m_ListCtrlComputerInfo.SetItem( index,2,LVIF_TEXT,strHost, 0, 0, 0,0 );
  233. Host = strHost;
  234. num++;
  235. }
  236. else
  237. {
  238. if( Host != strHost && num == 1 && strHost != _T("") )
  239. {
  240. m_ListCtrlComputerInfo.SetItem( index,1,LVIF_TEXT,strHost, 0, 0, 0,0 );
  241. Group = strHost;
  242.     num++;
  243. }
  244. else 
  245. {
  246. if( strHost != Host && strHost != Group && num == 2 && strHost != _T(""))
  247. {
  248. User = strHost;
  249. if( User != _T("__MSBROWSE__") )
  250. {
  251. m_ListCtrlComputerInfo.SetItem( index,3,LVIF_TEXT,User, 0, 0, 0,0 );
  252. num++;
  253. }
  254. }
  255. }
  256. }
  257. strMac = strHex;
  258. strHost = _T("");
  259. strHex = _T("");
  260. }
  261. }
  262. SetEvent( wait_handle );
  263. }
  264. void CScanLanComputerDlg::OnFieldchangedIpaddress1( NMHDR* pNMHDR, LRESULT* pResult ) 
  265. {
  266. unsigned char AddrB[4];
  267. m_IPEdit1.GetAddress( AddrB[0], AddrB[1], AddrB[2], AddrB[3] );
  268. m_IPEdit2.SetAddress( AddrB[0], AddrB[1], AddrB[2], 255 );
  269. *pResult = 0;
  270. }
  271. void CScanLanComputerDlg::OnBtnExit() 
  272. {
  273. GetDlgItem( IDC_BUTTON_CLEAR )->EnableWindow( TRUE );
  274. bExit = true;
  275. }
  276. CString MakeLen( CString csDst,int nLength )
  277. {
  278. if( csDst.GetLength() < nLength )
  279. {
  280. for( int i = csDst.GetLength(); i < nLength; i++ )
  281. {
  282. csDst += ' ';
  283. }
  284. }
  285. else 
  286. {
  287. csDst += ' ';
  288. }
  289. return csDst;
  290. }
  291. void CScanLanComputerDlg::OnBtnSave() 
  292. {
  293. int nCount = m_ListCtrlComputerInfo.GetItemCount();
  294. CFile f;
  295. CFileException e;
  296. CString csFileName = _T("");
  297. if ( 0 == m_ListCtrlComputerInfo.GetItemCount())
  298. {
  299. AfxMessageBox( _T("当前列表中没有内容,保存没有意义!"));
  300. return;
  301. }
  302. CTime t = CTime::GetCurrentTime();
  303. CString csTime = t.Format( _T("%Y年%m月%d日-%H时%M分%S秒"));
  304. csTime = _T("网络邻居_") + csTime;
  305. CFileDialog FileDlg( FALSE,_T("txt"),csTime,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("txt"),NULL );
  306. if ( FileDlg.DoModal() == IDOK )
  307. {
  308. UpdateData( true );
  309. csFileName = FileDlg.GetFileName();
  310. UpdateData( false );
  311. if ( f.Open( csFileName, CFile::modeCreate | CFile::modeWrite, &e) )
  312. {
  313. CString csTitle = _T("");
  314. csTitle = _T("IP地址           工作组          主机            用户             MAC地址rn");
  315. csTitle += _T("-----------------------------------------------------------------------------------rn");
  316. f.Write( csTitle, csTitle.GetLength() );
  317. for ( int i = 0; i < nCount; i++ )
  318. {
  319. csTitle = MakeLen( m_ListCtrlComputerInfo.GetItemText(i,0),17 )
  320. +MakeLen( m_ListCtrlComputerInfo.GetItemText(i,1),14 )
  321.     +MakeLen( m_ListCtrlComputerInfo.GetItemText(i,2),14 )
  322. +MakeLen( m_ListCtrlComputerInfo.GetItemText(i,3),14 )
  323. +MakeLen( m_ListCtrlComputerInfo.GetItemText(i,4),17 );
  324. csTitle += "rnrn";
  325. f.Write( csTitle, csTitle.GetLength() );
  326. }
  327. f.Close();
  328. }
  329. }
  330. }
  331. void CScanLanComputerDlg::OnDblclkListView( NMHDR* pNMHDR, LRESULT* pResult ) 
  332. if ( 0 == m_ListCtrlComputerInfo.GetItemCount() )
  333. {
  334. AfxMessageBox(_T("没有主机显示!"));
  335. return;
  336. }
  337. POSITION pos = m_ListCtrlComputerInfo.GetFirstSelectedItemPosition();
  338. if ( NULL == pos )
  339. {
  340. AfxMessageBox(_T("请选择要打开的主机!"));
  341. return;
  342. }
  343.     int nSelIndex = m_ListCtrlComputerInfo.GetNextSelectedItem( pos );
  344. CString csHostName = _T("");
  345. csHostName = m_ListCtrlComputerInfo.GetItemText( nSelIndex, 2 );
  346. csHostName = "\\" + csHostName;
  347. char* host = &char( *csHostName );
  348. ::ShellExecute( this->GetSafeHwnd(), _T("open"), host, NULL, _T("c:\"), SW_SHOW );
  349. *pResult = 0;
  350. }
  351. void CScanLanComputerDlg::OnButtonClear() 
  352. {
  353. if ( (0 == m_ListBoxIP.GetCount()) && (0 == m_ListBoxIP.GetCount()) )
  354. {
  355. AfxMessageBox( _T("所有列表都已经为空,清除没有意义!"));
  356. return;
  357. }
  358. // 清空 listbox.
  359. m_ListBoxIP.ResetContent();
  360. // 清空 listctrl.
  361. m_ListCtrlComputerInfo.DeleteAllItems();
  362. }
  363. void CScanLanComputerDlg::OnButtonCancel() 
  364. {
  365. CDialog::OnCancel();
  366. }