代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Port_Scanner_ein
{
public partial class Form1 : Form
{
public int port=80;
private Thread scanThread;
private int portnow;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//创建线程,并创建ThreadStart委托对象
Thread process = new Thread(new ThreadStart(PortScan));
process.Start();
//
progressBar1.Minimum = Int32.Parse(startbox.Text);
progressBar1.Maximum = Int32.Parse(endbox.Text);
//
listBox1.Items.Add("端口扫描器--EIN\n");
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
labelstart.Text = startbox.Text;
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
labelstop.Text = endbox.Text;
}
private void progressBar1_Click(object sender, EventArgs e)
{
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void labelstop_Click(object sender, EventArgs e)
{
}
private void labelstart_Click(object sender, EventArgs e)
{
}
public void Scan()
{
int nport=port; //设置端口号
TcpClient tc = new TcpClient(); //使用高级的TcpClient类
tc.SendTimeout = tc.ReceiveTimeout = 2000; //设置超时时间
Thread Threadnow = scanThread; //创建线程变量
try
{
tc.Connect(textBox1.Text, nport);
if(tc.Connected)
{
listBox1.Items.Add("端口" + port + "是开放的!"); //端口开放输出信息
}
}
catch
{
}
}
public void PortScan()
{
int Sport, Eport;
Sport = Int32.Parse(startbox.Text);
Eport = Int32.Parse(endbox.Text);
if((Sport >= 0 && Sport <= 65536) && (Eport >= 0 && Eport <= 65536) && (Sport <= Eport)) //检查输入范围是否合法
{
for (int i = Sport; i < Eport; i++)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
port = i;
scanThread = new Thread(new ThreadStart(Scan));
scanThread.Start();
//使线程睡眠
System.Threading.Thread.Sleep(20);
progressBar1.Value = i;
labelnow.Text = i.ToString();
}
}
listBox1.Items.Add("扫描结束!");
}
private void labelnow_Click(object sender, EventArgs e)
{
}
}
}
界面设计
运行
心得:
关于多线程的运行
需要加入
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
否则程序会报错 线程间操作无效
原因如下:
多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制。
这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为false;然后就能安全的访问窗体控件。
如果捕获了对错误线程的调用,则为 true;否则为 false。
这是我找到的解释