多线程扫描计算机

作者:网际浪子

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace WindowsApplication31
{
    /// <summary> 
    /// Form1 的摘要说明。 
    /// </summary> 
    public delegate void UpdateList(string sIP, string sHostName);
    public class Form1 : System.Windows.Forms.Form
    {
        /// <summary> 
        /// 必需的设计器变量。 
        /// </summary> 
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.ProgressBar progressBar1;
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.NumericUpDown numericUpDown1;
        private System.Windows.Forms.NumericUpDown numericUpDown2;
        private System.Windows.Forms.NumericUpDown numericUpDown3;
        private System.Windows.Forms.NumericUpDown numericUpDown4;
        private System.Windows.Forms.NumericUpDown numericUpDown5;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
        private System.DateTime StartTime;

        public Form1()
        {
            // 
            // Windows 窗体设计器支持所必需的 
            // 
            InitializeComponent();

            // 
            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 
            // 
        }

        /// <summary> 
        /// 清理所有正在使用的资源。 
        /// </summary> 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code 
        /// <summary> 
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
        /// 此方法的内容。 
        /// </summary> 
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.progressBar1 = new System.Windows.Forms.ProgressBar();
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.label2 = new System.Windows.Forms.Label();
            this.label1 = new System.Windows.Forms.Label();
            this.numericUpDown5 = new System.Windows.Forms.NumericUpDown();
            this.numericUpDown4 = new System.Windows.Forms.NumericUpDown();
            this.numericUpDown3 = new System.Windows.Forms.NumericUpDown();
            this.numericUpDown2 = new System.Windows.Forms.NumericUpDown();
            this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
            this.label3 = new System.Windows.Forms.Label();
            this.label4 = new System.Windows.Forms.Label();
            this.groupBox1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
            this.SuspendLayout();
            this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.button1.Location = new System.Drawing.Point(304, 41);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 36);
            this.button1.TabIndex = 1;
            this.button1.Text = "扫描";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.progressBar1.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.progressBar1.Location = new System.Drawing.Point(0, 316);
            this.progressBar1.Name = "progressBar1";
            this.progressBar1.Size = new System.Drawing.Size(414, 23);
            this.progressBar1.TabIndex = 2;
            this.listBox1.ItemHeight = 12;
            this.listBox1.Location = new System.Drawing.Point(0, 82);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(414, 232);
            this.listBox1.TabIndex = 3;
            this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
                this.label2 ,
                this.label1 ,
                this.numericUpDown5 ,
                this.numericUpDown4 ,
                this.numericUpDown3 ,
                this.numericUpDown2 ,
                this.numericUpDown1 });
            this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.groupBox1.Location = new System.Drawing.Point(2, 8);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(282, 70);
            this.groupBox1.TabIndex = 1;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "选择IP地址";
            this.label2.Location = new System.Drawing.Point(164, 46);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(46, 18);
            this.label2.TabIndex = 11;
            this.label2.Text = "终点:";
            this.label1.Location = new System.Drawing.Point(164, 22);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(46, 18);
            this.label1.TabIndex = 10;
            this.label1.Text = "起点:";
            this.numericUpDown5.Location = new System.Drawing.Point(224, 44);
            this.numericUpDown5.Maximum = new System.Decimal(new int[] {
                255 , 0 , 0 , 0});
            this.numericUpDown5.Name = "numericUpDown5";
            this.numericUpDown5.Size = new System.Drawing.Size(40, 21);
            this.numericUpDown5.TabIndex = 9;
            this.numericUpDown4.Location = new System.Drawing.Point(224, 20);
            this.numericUpDown4.Maximum = new System.Decimal(new int[] {
                255 , 0 , 0 , 0});
            this.numericUpDown4.Name = "numericUpDown4";
            this.numericUpDown4.Size = new System.Drawing.Size(40, 21);
            this.numericUpDown4.TabIndex = 8;
            this.numericUpDown3.Location = new System.Drawing.Point(108, 32);
            this.numericUpDown3.Maximum = new System.Decimal(new int[] {
                255 , 0 , 0 , 0});
            this.numericUpDown3.Name = "numericUpDown3";
            this.numericUpDown3.Size = new System.Drawing.Size(40, 21);
            this.numericUpDown3.TabIndex = 7;
            this.numericUpDown3.value = new System.Decimal(new int[] {
                198 , 0 , 0 , 0});
            this.numericUpDown2.Location = new System.Drawing.Point(62, 32);
            this.numericUpDown2.Maximum = new System.Decimal(new int[] {
                255 , 0 , 0 , 0});
            this.numericUpDown2.Name = "numericUpDown2";
            this.numericUpDown2.Size = new System.Drawing.Size(40, 21);
            this.numericUpDown2.TabIndex = 6;
            this.numericUpDown2.value = new System.Decimal(new int[] {
                138 , 0 , 0 , 0});
            this.numericUpDown1.Location = new System.Drawing.Point(18, 32);
            this.numericUpDown1.Maximum = new System.Decimal(new int[] {
                255 , 0 , 0 , 0});
            this.numericUpDown1.Name = "numericUpDown1";
            this.numericUpDown1.Size = new System.Drawing.Size(38, 21);
            this.numericUpDown1.TabIndex = 5;
            this.numericUpDown1.value = new System.Decimal(new int[] {
                10 , 0 , 0 , 0});
            this.label3.Location = new System.Drawing.Point(306, 18);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(42, 18);
            this.label3.TabIndex = 11;
            this.label3.Text = "耗时:";
            this.label4.Location = new System.Drawing.Point(350, 18);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(76, 18);
            this.label4.TabIndex = 12;
            this.label4.Text = "0";
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.ClientSize = new System.Drawing.Size(414, 339);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                this.label4 ,
                this.label3 ,
                this.groupBox1 ,
                this.listBox1 ,
                this.progressBar1 ,
                this.button1});
            this.MaximizeBox = false;
            this.Name = "Form1";
            this.Text = "扫描网络计算机";
            this.groupBox1.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
            this.ResumeLayout(false);
        }
        #endregion

        /// <summary> 
        /// 应用程序的主入口点。 
        /// </summary> 
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        public class ping
        {
            public UpdateList ul;
            public string ip; //接收传送来的IP地址字符串 
            public string HostName;//向主进展传递对应IP地址是否在线数据 
                                   //这个过程用来判断传送来的IP地址对应计算机是否在线 
            public void scan()
            {
                IPAddress myIP = IPAddress.Parse(ip);
                try
                {
                    IPHostEntry myHost = Dns.GetHostByAddress(myIP);
                    HostName = myHost.HostName.ToString();
                }
                catch
                {
                    HostName = "";
                }
                if (HostName == "")
                    HostName = " 主机没有响应!";
                if (ul != null)
                    ul(ip, HostName);
            }
        }

        void UpdateMyList(string sIP, string sHostName)
        {
            lock (listBox1)
            {
                listBox1.Items.Add(sIP + " " + sHostName);
                if (progressBar1.value != progressBar1.Maximum)
                {
                    progressBar1.value++;
                }
                if (progressBar1.value == progressBar1.Maximum)
                {
                    MessageBox.Show("成功完成检测!", "提示");
                    DateTime EndTime = DateTime.Now;
                    TimeSpan ts = EndTime - StartTime;
                    label4.Text = ts.Seconds.ToString() + "秒";
                    progressBar1.value = progressBar1.Minimum;
                }
            }
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            listBox1.Items.Clear(); //清除扫描结果显示区域 
            StartTime = DateTime.Now; //获取当前时间 
            string mask = numericUpDown1.value.ToString() + "." + numericUpDown2.value.ToString() +
                "." + numericUpDown3.value.ToString() + ".";
            int Min = (int)numericUpDown4.value;
            int Max = (int)numericUpDown5.value;
            if (Min > Max)
            {
                MessageBox.Show("输入的IP地址区间不合法,请检查!", "错误!");
                return;
            }
            //判断输入的IP地址区间是否合法 
            int _ThreadNum = Max - Min + 1;
            Thread[] mythread = new Thread[_ThreadNum];
            //创建一个多个Thread实例 
            progressBar1.Minimum = Min;
            progressBar1.Maximum = Max + 1;
            progressBar1.value = Min;
            int i;
            for (i = Min; i <= Max; i++)
            {
                int k = Max - i;
                ping HostPing = new ping(); //创建一个ping实例 
                HostPing.ip = mask + i.ToString();
                HostPing.ul = new UpdateList(UpdateMyList); //向这个ping实例中传递IP地址字符串 
                mythread[k] = new Thread(new ThreadStart(HostPing.scan)); //初始化一个线程实例 
                mythread[k].Start(); //启动线程 
            }
        }
    }
}
Powered by DvNews.net
来源:uncj.net
阅读:152 次
日期:2003-6-30
Contributors: FHL