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上始终不能及时显示,而是等所有线程结束后才显示“结束搜索“。 |
|