主题: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]
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]