c#初学日记:多线程扫描网络计算机
首先定义一个UpDataList,以后用于创建线程实例
public delegate void UpDataList(string sIP,string sHostName);
定义一个名叫ping的class,用于计算机的扫描模块
public class ping
{
public UpDataList ul;a
public string sIP;//接收传递过来的IP地址
public string sHostName;//向主进程传递计算机名
public string sMac;//向主进程传递远程主机MAC地址
public string sUser;//向主进程传递远程主机当前用户
public string sHDsize;//硬盘容量
public string sHDuse;//已用空间
public string sHDfree;//剩余空间
public void scan()
{
IPAddress myIP=IPAddress.Parse(sIP);
try
{
IPHostEntry myHost=Dns.GetHostByAddress(myIP);//根据IP获得主机名
sHostName=myHost.HostName.ToString();
}
catch
{
sHostName="";
}
if (sHostName=="")
sHostName="no";
if (ul !=null)
ul(sIP,sHostName);
}
}
扫描数据写入listview中(这部分是在线程中调用的。其中写出时要用lock锁住listView1,不让其它线程写入)
void UpDataMyList(string sIP,string sHostName)
{
//写入扫描数据
if(sHostName!="no")//主机在线是就写入数据
{
lock(this.listView1)//锁住listView1,保证在写入时的独占权
{
ListViewItem listViewItem=new ListViewItem(new string[]{sHostName,sIP});
listView1.Items.Add(listViewItem);
listBox1.Items.Add("扫描"+sIP+"完成");
}
}
else
{
listBox1.Items.Add(sIP+"不在线");
}
}
其中的网段部分考虑以后可以用ini文件等提供,可以由用户自己设想要扫描的内容。现在我自己手工加了4个网段。由扫描10网段为例:
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(e.Node.Text.ToString()=="扫描10网段")
{
listView1.Items.Clear();//清空listView1
listBox1.Items.Clear();//清空listBox1
//创建多个线程实例
int min=1;
int max=254;//min和max定义扫描的范围是192.168.10.1-192.168.10.254
string Mask="192.168.10.";
int threadNum=max-min+1;
Thread[] myThread=new Thread[threadNum];
for(int i=min;i<=max;++i)
{
try
{
int k=max-i;
ping HostPing=new ping();//创建一个ping的实例
HostPing.sIP=Mask+i.ToString();//获得一个IP
HostPing.ul=new UpDataList(UpDataMyList);//向主线程传送IP地址
myThread[k]=new Thread(new ThreadStart(HostPing.scan));//初始化一个线程的实例
myThread[k].Start();
}
catch
{
}
}
}
}
如上代码运行后能正常用多线程扫描10网段了。总算完成了一部分
忘记加上初始化listView1的代码了:
private void setListView()
{
//以下为初始化listView1的代码
listView1.View=View.Details;//设置listView1的显示方式为Details
listView1.MultiSelect=false;//禁止选中多行
listView1.Scrollable=true;//显示内容超出范围时,允许显示滚动条
listView1.FullRowSelect=true;//当项目选中时,同行所有子项都突出显示
listView1.GridLines=true;//显示网格线
//初始化表头
listView1.Columns.Add("电脑名称",100,HorizontalAlignment.Left);
listView1.Columns.Add("IP地址",150,HorizontalAlignment.Left);
listView1.Columns.Add("MAC地址",150,HorizontalAlignment.Left);
listView1.Columns.Add("当前用户",100,HorizontalAlignment.Left);
listView1.Columns.Add("硬盘空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("已用空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("剩余空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("扫描时间",100,HorizontalAlignment.Left);
}
在form_load事件中调用setListView就可以了
public delegate void UpDataList(string sIP,string sHostName);
定义一个名叫ping的class,用于计算机的扫描模块
public class ping
{
public UpDataList ul;a
public string sIP;//接收传递过来的IP地址
public string sHostName;//向主进程传递计算机名
public string sMac;//向主进程传递远程主机MAC地址
public string sUser;//向主进程传递远程主机当前用户
public string sHDsize;//硬盘容量
public string sHDuse;//已用空间
public string sHDfree;//剩余空间
public void scan()
{
IPAddress myIP=IPAddress.Parse(sIP);
try
{
IPHostEntry myHost=Dns.GetHostByAddress(myIP);//根据IP获得主机名
sHostName=myHost.HostName.ToString();
}
catch
{
sHostName="";
}
if (sHostName=="")
sHostName="no";
if (ul !=null)
ul(sIP,sHostName);
}
}
扫描数据写入listview中(这部分是在线程中调用的。其中写出时要用lock锁住listView1,不让其它线程写入)
void UpDataMyList(string sIP,string sHostName)
{
//写入扫描数据
if(sHostName!="no")//主机在线是就写入数据
{
lock(this.listView1)//锁住listView1,保证在写入时的独占权
{
ListViewItem listViewItem=new ListViewItem(new string[]{sHostName,sIP});
listView1.Items.Add(listViewItem);
listBox1.Items.Add("扫描"+sIP+"完成");
}
}
else
{
listBox1.Items.Add(sIP+"不在线");
}
}
其中的网段部分考虑以后可以用ini文件等提供,可以由用户自己设想要扫描的内容。现在我自己手工加了4个网段。由扫描10网段为例:
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(e.Node.Text.ToString()=="扫描10网段")
{
listView1.Items.Clear();//清空listView1
listBox1.Items.Clear();//清空listBox1
//创建多个线程实例
int min=1;
int max=254;//min和max定义扫描的范围是192.168.10.1-192.168.10.254
string Mask="192.168.10.";
int threadNum=max-min+1;
Thread[] myThread=new Thread[threadNum];
for(int i=min;i<=max;++i)
{
try
{
int k=max-i;
ping HostPing=new ping();//创建一个ping的实例
HostPing.sIP=Mask+i.ToString();//获得一个IP
HostPing.ul=new UpDataList(UpDataMyList);//向主线程传送IP地址
myThread[k]=new Thread(new ThreadStart(HostPing.scan));//初始化一个线程的实例
myThread[k].Start();
}
catch
{
}
}
}
}
如上代码运行后能正常用多线程扫描10网段了。总算完成了一部分
忘记加上初始化listView1的代码了:
private void setListView()
{
//以下为初始化listView1的代码
listView1.View=View.Details;//设置listView1的显示方式为Details
listView1.MultiSelect=false;//禁止选中多行
listView1.Scrollable=true;//显示内容超出范围时,允许显示滚动条
listView1.FullRowSelect=true;//当项目选中时,同行所有子项都突出显示
listView1.GridLines=true;//显示网格线
//初始化表头
listView1.Columns.Add("电脑名称",100,HorizontalAlignment.Left);
listView1.Columns.Add("IP地址",150,HorizontalAlignment.Left);
listView1.Columns.Add("MAC地址",150,HorizontalAlignment.Left);
listView1.Columns.Add("当前用户",100,HorizontalAlignment.Left);
listView1.Columns.Add("硬盘空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("已用空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("剩余空间",100,HorizontalAlignment.Left);
listView1.Columns.Add("扫描时间",100,HorizontalAlignment.Left);
}
在form_load事件中调用setListView就可以了