c# 获得局域网主机列表实例
2020-01-24 03:51:06
供稿:网友
 
						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上始终不能及时显示,而是等所有线程结束后才显示“结束搜索“。