程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c# 獲得局域網主機列表實例

c# 獲得局域網主機列表實例

編輯:關於C語言
using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 
using System.Net; 
using System.Threading; 

namespace WindowLanSearch 

/// <summary> 
/// Form1 的摘要說明。 
/// </summary> 
public class Form1 : System.Windows.Forms.Form 

  private System.Windows.Forms.TextBox textBox1; 
  private System.Windows.Forms.Button button1; 
  private string[,] LanHost; 
  private System.Windows.Forms.ProgressBar progressBarSearch; 
  private Thread[]  thread; 
  private System.Windows.Forms.ListView listVIEw1; 
  private System.Windows.Forms.ColumnHeader columnHeader1; 
  private System.Windows.Forms.ColumnHeader columnHeader2; 
  private string str; 
  /// <summary> 
  /// 必需的設計器變量。 
  /// </summary> 
  private System.ComponentModel.Container components = null; 

  public Form1() 
  { 
   // 
   // Windows 窗體設計器支持所必需的 
   // 
   InitializeComponent(); 
   InitLanHost(); 
   progressBarSearch.Maximum = 255; 

   // 
   // TODO: 在 InitializeComponent 調用後添加任何構造函數代碼 
   // 
  } 

  /// <summary> 
  /// 數組初始化 
  /// </summary> 
  private void InitLanHost() 
  { 
   LanHost = new string[255,2]; 
   for (int i=0;i<255;i++) 
   { 
    LanHost[i,0] = ""; 
    LanHost[i,1] = ""; 
   } 
  } 

  /// <summary> 
  /// 清理所有正在使用的資源。 
  /// </summary> 
  protected override void Dispose( bool disposing ) 
  { 
   if( disposing ) 
   { 
    if (components != null)  
    { 
     components.Dispose(); 
    } 
   } 
   base.Dispose( disposing ); 
  } 

  #region Windows 窗體設計器生成的代碼 
  /// <summary> 
  /// 設計器支持所需的方法 - 不要使用代碼編輯器修改 
  /// 此方法的內容。 
  /// </summary> 
  private void InitializeComponent() 
  { 
   this.textBox1 = new System.Windows.Forms.TextBox(); 
   this.button1 = new System.Windows.Forms.Button(); 
   this.progressBarSearch = new System.Windows.Forms.ProgressBar(); 
   this.listView1 = new System.Windows.Forms.ListVIEw(); 
   this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); 
   this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); 
   this.SuspendLayout(); 
   //  
   // textBox1 
   //  
   this.textBox1.Location = new System.Drawing.Point(24, 40); 
   this.textBox1.Multiline = true; 
   this.textBox1.Name = "textBox1"; 
   this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; 
   this.textBox1.Size = new System.Drawing.Size(176, 296); 
   this.textBox1.TabIndex = 0; 
   this.textBox1.Text = ""; 
   //  
   // button1 
   //  
   this.button1.Location = new System.Drawing.Point(456, 40); 
   this.button1.Name = "button1"; 
   this.button1.TabIndex = 1; 
   this.button1.Text = "開始搜索"; 
   this.button1.Click += new System.EventHandler(this.button1_Click); 
   //  
   // progressBarSearch 
   //  
   this.progressBarSearch.Location = new System.Drawing.Point(32, 360); 
   this.progressBarSearch.Name = "progressBarSearch"; 
   this.progressBarSearch.Size = new System.Drawing.Size(490, 24); 
   this.progressBarSearch.TabIndex = 2; 
   //  
   // listVIEw1 
   //  
   this.listVIEw1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 
                      this.columnHeader1, 
                      this.columnHeader2}); 
   this.listVIEw1.Location = new System.Drawing.Point(248, 40); 
   this.listView1.Name = "listVIEw1"; 
   this.listVIEw1.Size = new System.Drawing.Size(184, 288); 
   this.listVIEw1.TabIndex = 5; 
   //  
   // columnHeader1 
   //  
   this.columnHeader1.Text = "dddd"; 
   //  
   // columnHeader2 
   //  
   this.columnHeader2.Text = "sssss"; 
   //  
   // Form1 
   //  
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); 
   this.ClIEntSize = new System.Drawing.Size(544, 413); 
   this.Controls.Add(this.listVIEw1); 
   this.Controls.Add(this.progressBarSearch); 
   this.Controls.Add(this.button1); 
   this.Controls.Add(this.textBox1); 
   this.Name = "Form1"; 
   this.Text = "Form1"; 
   this.ResumeLayout(false); 

  } 
  #endregion 

  /// <summary> 
  /// 應用程序的主入口點。 
  /// </summary> 
  [STAThread] 
  static void Main()  
  { 
   Application.Run(new Form1()); 
  } 
  private void button1_Click(object sender, System.EventArgs e) 
  { 

   LanSearch(); 

  } 
  /// <summary> 
  /// 局域網搜索事件 
  /// </summary> 
  private void LanSearch() 
  { 
   thread = new Thread[255]; 

   ThreadStart threadMethod; 

   Thread threadProgress = new Thread(new ThreadStart(progressSearch)); 
   threadProgress.Start(); 

   string localhost = (Dns.GetHostByName(Dns.GetHostName())).AddressList[0].ToString();  //本地主機IP地址 
   str = localhost.Substring(0,localhost.LastIndexOf(".")); 

   for (int i=0;i<255;i++)  //建立255個線程掃描IP 
   { 
    threadMethod = new ThreadStart(LanSearchThreadMethod); 
    thread[i] = new Thread(threadMethod); 
    thread[i].Name = i.ToString(); 
    thread[i].Start(); 
    if (!thread[i].Join(100))    //Thread.Join(100)不知道這處這麼用對不對,感覺沒什麼效果一樣 
    { 
     thread[i].Abort(); 
    } 
   } 

   GetLanHost(); 
   listLanHost(); 
  } 
  /// <summary> 
  /// 多線程搜索方法 
  /// </summary> 
  private void LanSearchThreadMethod() 
  { 
   int Currently_i = Convert.ToUInt16(Thread.CurrentThread.Name);  //當前進程名稱 

   IPAddress ScanIP = IPAddress.Parse( str + "."+Convert.ToString(Currently_i +1));  //獲得掃描IP地址 
   IPHostEntry ScanHost = null; 
   ScanHost = Dns.GetHostByAddress(ScanIP);   //獲得掃描IP地址主機信息 

   if (ScanHost != null) 
   { 
    LanHost[Currently_i,0] = ScanIP.ToString(); 
    LanHost[Currently_i,1] = ScanHost.HostName; 
   } 

   //progressBarSearch.Value = progressBarSearch.Value +1; 

  } 
  /// <summary> 
  /// 文本框顯示主機名與IP列表 
  /// </summary> 
  private void GetLanHost() 
  { 
   for (int i=0;i<255;i++) 
    if ( LanHost[i,0] !="") 
    { 
     textBox1.Text =textBox1.Text + LanHost[i,1] +":" +LanHost[i,0] + "\r\n"; 
    } 
  } 
  /// <summary> 
  /// listvIEw1 顯示搜索主機 
  /// </summary> 
  private void listLanHost() 
  { 
   listView1.View = VIEw.List; 

   ListVIEwItem aa ; 
   for (int i=0;i<255;i++) 
   { 
    if ( LanHost[i,0] !="") 
    { 
     aa= new ListVIEwItem(); 
     aa.Text = LanHost[i,1]; 
     aa.Tag = LanHost[i,0]; 
     listVIEw1.Items.Add(aa); 
    } 
   } 

  } 
  /// <summary> 
  /// 進度條處理線程 
  /// </summary> 
  private void progressSearch() 
  { 
   //label1.Text = "進度條只是時間估計,不是真實搜索進度!"; 
   progressBarSearch.Value = 0; 
   for (int i=0;i<255;i++) 
   { 
    progressBarSearch.Value = progressBarSearch.Value + 1; 
    Thread.Sleep(100); 
   } 
  } 



遺憾之處:因搜索較慢,沒有實現真實的搜索進度。 
不懂之處:實現文字提示時,當在鼠標事件首尾插入 
private void button1_Click(object sender, System.EventArgs e) 
  { 
    lab1.Text = “開始搜索”;      //新插入     
   LanSearch(); 
    lab1.Text = “結束搜索”;     //新插入 
  } 
文本提示時,在lab1上始終不能及時顯示,而是等所有線程結束後才顯示“結束搜索“。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved