多线程扫描网络计算机

首先定义一个UpDataList,以后用于创建线程实例
public delegate void UpDataList(string sIP,string sHostName);
定义一个名叫ping的class,用于计算机的扫描模块

None.gif public   class  ping
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   
public UpDataList ul;a
InBlock.gif   
public string sIP;//接收传递过来的IP地址
InBlock.gif
   public string sHostName;//向主进程传递计算机名
InBlock.gif
   public string sMac;//向主进程传递远程主机MAC地址
InBlock.gif
   public string sUser;//向主进程传递远程主机当前用户
InBlock.gif
   public string sHDsize;//硬盘容量
InBlock.gif
   public string sHDuse;//已用空间
InBlock.gif
   public string sHDfree;//剩余空间
InBlock.gif
   public void scan()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    IPAddress myIP
=IPAddress.Parse(sIP);
InBlock.gif    
try
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     IPHostEntry myHost
=Dns.GetHostByAddress(myIP);//根据IP获得主机名
InBlock.gif
     sHostName=myHost.HostName.ToString();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     sHostName
="";
ExpandedSubBlockEnd.gif    }

InBlock.gif    
if (sHostName=="")
InBlock.gif     sHostName
="no";
InBlock.gif    
if (ul !=null)
InBlock.gif     ul(sIP,sHostName);
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif  }

None.gif



扫描数据写入listview中(这部分是在线程中调用的。其中写出时要用lock锁住listView1,不让其它线程写入)

None.gif void  UpDataMyList( string  sIP, string  sHostName)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   
//写入扫描数据
InBlock.gif
   if(sHostName!="no")//主机在线是就写入数据
ExpandedSubBlockStart.gifContractedSubBlock.gif
   dot.gif{
InBlock.gif    
lock(this.listView1)//锁住listView1,保证在写入时的独占权
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif     ListViewItem listViewItem
=new ListViewItem(new string[]dot.gif{sHostName,sIP});
InBlock.gif     listView1.Items.Add(listViewItem);
InBlock.gif     listBox1.Items.Add(
"扫描"+sIP+"完成");
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif   }

InBlock.gif   
else
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    listBox1.Items.Add(sIP
+"不在线");
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif  }

None.gif



其中的网段部分考虑以后可以用ini文件等提供,可以由用户自己设想要扫描的内容。现在我自己手工加了4个网段。由扫描10网段为例:

None.gif private   void  treeView1_AfterSelect( object  sender, System.Windows.Forms.TreeViewEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   
if(e.Node.Text.ToString()=="扫描10网段")
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    listView1.Items.Clear();
//清空listView1
InBlock.gif
    listBox1.Items.Clear();//清空listBox1
InBlock.gif    
//创建多个线程实例
InBlock.gif
    int min=1;
InBlock.gif    
int max=254;//min和max定义扫描的范围是192.168.10.1-192.168.10.254
InBlock.gif
    string Mask="192.168.10.";
InBlock.gif    
int threadNum=max-min+1;
InBlock.gif    Thread[] myThread
=new Thread[threadNum];
InBlock.gif    
for(int i=min;i<=max;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     
try
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif      
int k=max-i;
InBlock.gif      ping HostPing
=new ping();//创建一个ping的实例
InBlock.gif
      HostPing.sIP=Mask+i.ToString();//获得一个IP
InBlock.gif
      HostPing.ul=new UpDataList(UpDataMyList);//向主线程传送IP地址
InBlock.gif
      myThread[k]=new Thread(new ThreadStart(HostPing.scan));//初始化一个线程的实例
InBlock.gif
      myThread[k].Start();
ExpandedSubBlockEnd.gif     }

InBlock.gif     
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
ExpandedSubBlockEnd.gif     }

ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif  }

None.gif

如上代码运行后能正常用多线程扫描10网段了。总算完成了一部分

忘记加上初始化listView1的代码了:

None.gif private   void  setListView()
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   
//以下为初始化listView1的代码
InBlock.gif
   listView1.View=View.Details;//设置listView1的显示方式为Details
InBlock.gif
   listView1.MultiSelect=false;//禁止选中多行
InBlock.gif
   listView1.Scrollable=true;//显示内容超出范围时,允许显示滚动条
InBlock.gif
   listView1.FullRowSelect=true;//当项目选中时,同行所有子项都突出显示
InBlock.gif
   listView1.GridLines=true;//显示网格线
InBlock.gif   
//初始化表头
InBlock.gif
   listView1.Columns.Add("电脑名称",100,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"IP地址",150,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"MAC地址",150,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"当前用户",100,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"硬盘空间",100,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"已用空间",100,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"剩余空间",100,HorizontalAlignment.Left);
InBlock.gif   listView1.Columns.Add(
"扫描时间",100,HorizontalAlignment.Left);
ExpandedBlockEnd.gif  }

None.gif

在form_load事件中调用setListView就可以了

转载于:https://www.cnblogs.com/suchenge/articles/888825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值