快速局域网扫描,使用Ping类

it2022-05-05  86

有些小问题,主要是超时处理上.具体我都加了注释 using  System; using  System.Collections.Generic; using  System.ComponentModel; using  System.Data; using  System.Drawing; using  System.Linq; using  System.Text; using  System.Windows.Forms; using  System.Threading; using  System.Net; using  System.Net.Sockets; using  System.Net.NetworkInformation; namespace  PingLan {      public   partial   class  Form1 : Form     {          public  Form1()         {             InitializeComponent();         }         DateTime StartTime;          public   delegate   void  DelPing( object  ip);          private   void  PingIP( object  obj)         {             IPAddress ipadd  =  (IPAddress)obj;             Ping p  =   new  Ping();             PingOptions po  =   new  PingOptions();             po.DontFragment  =   true ;              // 创建1个32字节的流              string  data  =   " 012345678901234567890123456789ab " ;              byte [] buffer  =  Encoding.ASCII.GetBytes(data);              // 超时,毫秒              int  timeout  =   120 ;             PingReply pr  =  p.Send(ipadd, timeout, buffer, po);              // ping成功              if  (pr.Status  ==  IPStatus.Success)             {                  // 线程调用                  if  (listBox1.InvokeRequired)                 {                     DelPing dp  =   new  DelPing(PingIP);                      this .Invoke(dp,  new   object [] { ipadd });                 }                  else                 {                     listBox1.Items.Add(ipadd.ToString()  +   "  在线 " );                      if  (toolStripProgressBar1.Value  !=  toolStripProgressBar1.Maximum)                         toolStripProgressBar1.Value ++ ;                      // 如果不检测超时IP,这里toolStripProgressBar1.Maximum要改                      if  (toolStripProgressBar1.Value  ==  toolStripProgressBar1.Maximum)                     {                         MessageBox.Show( " 检测完成! " " 完成 " , MessageBoxButtons.OK, MessageBoxIcon.Asterisk);                         button1.Enabled  =   true ;                         DateTime EndTime  =  DateTime.Now;                          // 时间间隔                         TimeSpan ts  =  EndTime  -  StartTime;                         toolStripStatusLabel1.Text  =   " 用时:  "   +  ts.Seconds.ToString();                         toolStripProgressBar1.Value  =  toolStripProgressBar1.Minimum;                     }                 }             }              // 如果检测超时,会很慢,而且貌似有点问题,列表框会无响应一段时间              // else // 失败,IPStatus.TimedOut              // {              //      // 线程调用              //     if (listBox1.InvokeRequired)              //     {              //         DelPing dp = new DelPing(PingIP);              //         this.Invoke(dp, new object[] { ipadd });              //     }              //     else              //     {              //         listBox1.Items.Add(ipadd.ToString() + " 离线");              //         if (toolStripProgressBar1.Value != toolStripProgressBar1.Maximum)              //             toolStripProgressBar1.Value++;              //         if (toolStripProgressBar1.Value == toolStripProgressBar1.Maximum)              //         {              //             MessageBox.Show("检测完成!", "完成", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);              //             button1.Enabled = true;              //             DateTime EndTime = DateTime.Now;              //              // 时间间隔              //             TimeSpan ts = EndTime - StartTime;              //             toolStripStatusLabel1.Text = "用时: " + ts.Seconds.ToString();              //             toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;              //         }              //     }              // }         }          private   void  button1_Click( object  sender, EventArgs e)         {             button1.Enabled  =   false ;             StartTime  =  DateTime.Now;              string  host;             IPAddress ipadds;             listBox1.Items.Clear();              string  mask  =  numericUpDown1.Value.ToString()  +   " . "   +  numericUpDown2.Value.ToString()  +   " . "   +  numericUpDown3.Value.ToString()  +   " . " ;              int  max  =  ( int )numericUpDown5.Value;              int  min  =  ( int )numericUpDown4.Value;              if  (min  >  max)             {                 MessageBox.Show( " IP地址范围错误! " " 错误 " , MessageBoxButtons.OK, MessageBoxIcon.Error);                 button1.Enabled  =   true ;                  return ;             }              else             {                  int  num  =  max  -  min  +   1 ;                  // Thread[] tr = new Thread[num];                 toolStripProgressBar1.Minimum  =  min;                  // 如果不检测超时IP,这里toolStripProgressBar1.Maximum要改                 toolStripProgressBar1.Maximum  =  max  +   1 ;                 toolStripProgressBar1.Value  =  min;                  for  ( int  i  =  min; i  <=  max; i ++ )                 {                      int  k  =  max  -  i;                     host  =  mask  +  i.ToString();                     ipadds  =  IPAddress.Parse(host);                      // 特别注明,如果线程中需要传参,一般,传1个参数,就用这个类,这个类参数必须是object的                     ParameterizedThreadStart mypar  =   new  ParameterizedThreadStart(PingIP);                      // 经测试发现及时使用线程数组,和使用单个线程差不多速度                      // tr[k] = new Thread(mypar);                      // tr[k].Start(ipadds);                      Thread th  =   new  Thread(mypar);                     th.Start(ipadds);                 }             }         }     } }

转载于:https://www.cnblogs.com/wind8250/archive/2008/05/23/1205427.html

相关资源:Windows下ping整个局域网查看在线设备的工具

最新回复(0)