c# 获得局域网主机列表实例

时间:2021-05-20

usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.Net;
usingSystem.Threading;

namespaceWindowLanSearch
{
///<summary>
///Form1的摘要说明。
///</summary>
publicclassForm1:System.Windows.Forms.Form
{
privateSystem.Windows.Forms.TextBoxtextBox1;
privateSystem.Windows.Forms.Buttonbutton1;
privatestring[,]LanHost;
privateSystem.Windows.Forms.ProgressBarprogressBarSearch;
privateThread[]thread;
privateSystem.Windows.Forms.ListViewlistView1;
privateSystem.Windows.Forms.ColumnHeadercolumnHeader1;
privateSystem.Windows.Forms.ColumnHeadercolumnHeader2;
privatestringstr;
///<summary>
///必需的设计器变量。
///</summary>
privateSystem.ComponentModel.Containercomponents=null;

publicForm1()
{
//
//Windows窗体设计器支持所必需的
//
InitializeComponent();
InitLanHost();
progressBarSearch.Maximum=255;

//
//TODO:在InitializeComponent调用后添加任何构造函数代码
//
}

///<summary>
///数组初始化
///</summary>
privatevoidInitLanHost()
{
LanHost=newstring[255,2];
for(inti=0;i<255;i++)
{
LanHost[i,0]="";
LanHost[i,1]="";
}
}

///<summary>
///清理所有正在使用的资源。
///</summary>
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(components!=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#regionWindows窗体设计器生成的代码
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.textBox1=newSystem.Windows.Forms.TextBox();
this.button1=newSystem.Windows.Forms.Button();
this.progressBarSearch=newSystem.Windows.Forms.ProgressBar();
this.listView1=newSystem.Windows.Forms.ListView();
this.columnHeader1=newSystem.Windows.Forms.ColumnHeader();
this.columnHeader2=newSystem.Windows.Forms.ColumnHeader();
this.SuspendLayout();
//
//textBox1
//
this.textBox1.Location=newSystem.Drawing.Point(24,40);
this.textBox1.Multiline=true;
this.textBox1.Name="textBox1";
this.textBox1.ScrollBars=System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size=newSystem.Drawing.Size(176,296);
this.textBox1.TabIndex=0;
this.textBox1.Text="";
//
//button1
//
this.button1.Location=newSystem.Drawing.Point(456,40);
this.button1.Name="button1";
this.button1.TabIndex=1;
this.button1.Text="开始搜索";
this.button1.Click+=newSystem.EventHandler(this.button1_Click);
//
//progressBarSearch
//
this.progressBarSearch.Location=newSystem.Drawing.Point(32,360);
this.progressBarSearch.Name="progressBarSearch";
this.progressBarSearch.Size=newSystem.Drawing.Size(490,24);
this.progressBarSearch.TabIndex=2;
//
//listView1
//
this.listView1.Columns.AddRange(newSystem.Windows.Forms.ColumnHeader[]{
this.columnHeader1,
this.columnHeader2});
this.listView1.Location=newSystem.Drawing.Point(248,40);
this.listView1.Name="listView1";
this.listView1.Size=newSystem.Drawing.Size(184,288);
this.listView1.TabIndex=5;
//
//columnHeader1
//
this.columnHeader1.Text="dddd";
//
//columnHeader2
//
this.columnHeader2.Text="sssss";
//
//Form1
//
this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);
this.ClientSize=newSystem.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]
staticvoidMain()
{
Application.Run(newForm1());
}
privatevoidbutton1_Click(objectsender,System.EventArgse)
{

LanSearch();

}
///<summary>
///局域网搜索事件
///</summary>
privatevoidLanSearch()
{
thread=newThread[255];

ThreadStartthreadMethod;

ThreadthreadProgress=newThread(newThreadStart(progressSearch));
threadProgress.Start();

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

for(inti=0;i<255;i++)//建立255个线程扫描IP
{
threadMethod=newThreadStart(LanSearchThreadMethod);
thread[i]=newThread(threadMethod);
thread[i].Name=i.ToString();
thread[i].Start();
if(!thread[i].Join(100))//Thread.Join(100)不知道这处这么用对不对,感觉没什么效果一样
{
thread[i].Abort();
}
}

GetLanHost();
listLanHost();
}
///<summary>
///多线程搜索方法
///</summary>
privatevoidLanSearchThreadMethod()
{
intCurrently_i=Convert.ToUInt16(Thread.CurrentThread.Name);//当前进程名称

IPAddressScanIP=IPAddress.Parse(str+"."+Convert.ToString(Currently_i+1));//获得扫描IP地址
IPHostEntryScanHost=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>
privatevoidGetLanHost()
{
for(inti=0;i<255;i++)
if(LanHost[i,0]!="")
{
textBox1.Text=textBox1.Text+LanHost[i,1]+":"+LanHost[i,0]+"\r\n";
}
}
///<summary>
///listview1显示搜索主机
///</summary>
privatevoidlistLanHost()
{
listView1.View=View.List;

ListViewItemaa;
for(inti=0;i<255;i++)
{
if(LanHost[i,0]!="")
{
aa=newListViewItem();
aa.Text=LanHost[i,1];
aa.Tag=LanHost[i,0];
listView1.Items.Add(aa);
}
}

}
///<summary>
///进度条处理线程
///</summary>
privatevoidprogressSearch()
{
//label1.Text="进度条只是时间估计,不是真实搜索进度!";
progressBarSearch.Value=0;
for(inti=0;i<255;i++)
{
progressBarSearch.Value=progressBarSearch.Value+1;
Thread.Sleep(100);
}
}
}
}

遗憾之处:因搜索较慢,没有实现真实的搜索进度。
不懂之处:实现文字提示时,当在鼠标事件首尾插入
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
lab1.Text=“开始搜索”;//新插入
LanSearch();
lab1.Text=“结束搜索”;//新插入
}
文本提示时,在lab1上始终不能及时显示,而是等所有线程结束后才显示“结束搜索“。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章