回 帖 发 新 帖 刷新版面

主题:SoS!制作一个可以随时结束的端口扫描器遇到一系列的问题

[img]http://blog.programfan.com/upfile/200808/20080828091528.jpg[/img]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;//正值表达式要用的
using System.Threading;

namespace 端口扫描器
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;//允许交差线程访问rtxtb_Result
        }

        bool  flag = true;
        public IPAddress address;
        public Thread[] Td=new Thread[1000];
        //TcpClient myTcpClient = new TcpClient();
        private void btnScan_Click(object sender, EventArgs e)
        {
            if (flag == true)
            {
                if (txtb_IP.Text.Trim().Length == 0 || txtb_K.Text.Trim().Length == 0 || txtb_J.Text.Trim().Length == 0)
                {
                    MessageBox.Show("请把信息添完整!");
                    return;
                }
                else if (!IPAddress.TryParse(txtb_IP.Text,out address) || Convert.ToInt32(txtb_K.Text) > 65535 || Convert.ToInt32(txtb_K.Text) < 0 || Convert.ToInt32(txtb_J.Text) > 65535 || Convert.ToInt32(txtb_J.Text) < 0 || Convert.ToInt32(txtb_K.Text)>Convert.ToInt32(txtb_J.Text) )
                {
                    MessageBox.Show("您的某项输入不规范");
                    return;
                }
                else 
                {
                    flag = false;
                    btnScan.Text = "停止扫描!";
                    rtxtb_Result.Text =null;
                    for(int i=Convert.ToInt32(txtb_K.Text);i<Convert.ToInt32(txtb_J.Text);i++)
                    {//如果有60000个端口总不能一口气开那么多线程吧
                        Td[i] = new Thread(new ParameterizedThreadStart(Scan));
                        //Td.IsBackground = true;//主程序结束,后台进程会自动结束
                        Td[i].Start(i);
                    }                   
                }
                //return;
            }
            else
            {
                flag = true;
                btnScan.Text = "开始扫描!";
                btnScan.Enabled = false;
                try
                {
                    for (int i = Convert.ToInt32(txtb_K.Text); i < Convert.ToInt32(txtb_J.Text); i++)
                    {
                        //if (Td[i].ThreadState == ThreadState.Running)
                        //{
                        //    Td[i].Abort();
                        //}
                        if (Td[i] != null && Td[i].IsAlive)
                        {
                            Td[i].Abort();//结束存活进程-------好象做不到
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }              
                rtxtb_Result.Text += "---------------" + DateTime.Now.ToString("hh:mm:ss") + " 停止扫描----------------------\n";
                btnScan.Enabled = true;
                //return;
            }
        }
        
        public void Scan(object port)
        {
            try
            {
                try
                {
                    TcpClient myTcpClient = new TcpClient();
                    myTcpClient.Connect(txtb_IP.Text, (int)port);
                    lock ((object)(rtxtb_Result.Text))
                    {
                        rtxtb_Result.Text += txtb_IP.Text + "  端口" + port.ToString() + "开放" + "\n";
                    }
                    myTcpClient.Close();
                }
                catch
                {
                    lock ((object)(rtxtb_Result.Text))
                    {
                        rtxtb_Result.Text += txtb_IP.Text + "  端口" + port.ToString() + "关闭" + "\n";
                    }
                }
            }
            catch
            {
                //可能rtxtb_Result已经Dispose()了,所以无法更新也会报错
            }
            //Thread.CurrentThread.Abort();//不释放又不行
            //有了它Designer.cs里base.Dispose(disposing);Value Dispose() cannot be called while doing CreateHandle().            
        }

    }   
}
/*目标实现可以随时结束的扫描程序。*/

[fly]革命之路很漫长,我标注的每个地方都要解决才能成功[/fly]

回复列表 (共2个回复)

沙发

1、你不需要一口气启动那么多线程,轮流来就是了。
2、别让控件关闭线程调用检查功能,准备一个根据InvokeRequired来决定是否回调的方法将线程上的文本显示任务提交给UI线程。
3、由于你的线程访问混乱,并且还锁定UI线程,所以再次点击按钮不会迅速反应过来,Abort效果也就体现不出来。按照之前两条修改,然后再看终止效果。你也可以在线程的循环处理中(分批启动线程)设置终止标识(一个全局变量之类的,比如终止时设为true),如果检测到true就不再生成新线程同时终止已有线程,并且重置该标识。
4、如果想瞬间立刻停止,以目前的结构而言,应该做不到。

板凳

果然!比想象中还难!

我来回复

您尚未登录,请登录后再回复。点此登录或注册