zoukankan      html  css  js  c++  java
  • 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就可以了

  • 相关阅读:
    Mac下使用charles遇到的问题以及解决办法
    webp图片实践之路
    一个粗心的Bug,JSON格式不规范导致AJAX错误
    IE6/7下空div占用空间的问题
    通俗易懂的来讲讲DOM
    Javascript
    简单入门canvas
    HTML5 Boilerplate
    网页字体知识
    备战CKA每日一题——第8天 | initContainer概念、用法、使用场景简介;k8s secret env、volume考题引出
  • 原文地址:https://www.cnblogs.com/kokoliu/p/519517.html
Copyright © 2011-2022 走看看