C#局域网扫描软件3

今天开始进入扫描网络计算机的编程,暂时先写根据IP扫描计算机名的代码。为提高速度,引入了多线程编程的方式,但是有一个奇怪的问题,经常会放生没有将对象引用设置到对象实例的错误,但有时就是正常的,奇怪!现在将所有代码写在下面:

  public class ping
  {
   public UpdataList ul;
   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 (ul !=null)
     ul(sIP,sHostName);
   }
  }

   private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
   {
    if (e.Node.Text.ToString()=="扫描10网段")
    {
     dataTable.Clear();
     listBox1.Items.Clear();
     //创建多个Thread实例
     int min=1;
     int max=255;
     string Mask="192.168.10.";
     int ThreadNum=max-min+1;
     Thread[] myThread=new Thread[ThreadNum];
     for (int i=min;i<=max;i++)
     {
      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();
     }
     
void UpDataMyList(string sIP,string sHostName)
   {
    //写入扫描数据
    if (sHostName !="")
    {
     lock(dataTable)
     {
      DataRow dataRow=dataTable.NewRow();
      dataRow["cComputerName"]=sHostName;
      dataRow["cIpAddress"]=sIP;
      dataRow["cMac"]="";
      dataRow["cUser"]="";
      dataRow["cOther"]="";
      dataRow["V"]="";
      dataTable.Rows.Add(dataRow);
      listBox1.Items.Add("扫描"+sIP+"完成");
     }
     
    }
    else
    {
     listBox1.Items.Add(sIP+"不在线");
    }
   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值