一、新建项目
新建---->文件----->项目------>windows窗体应用程序----->scan.sln
二、设计界面
三、写代码
四、最后效果
1、打开虚拟机---->windowserver2003---->cmd---->ipconfig
得到ip地址192.168.67.131
2、输入:
3、在2003里输入
netstat -an -p tcp 可看到扫到1000以内的端口开放结果相同
【scan.exe】
源代码:
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.Sockets;//通信相关都会用到的命名空间
using System.Threading;//子线程
//using System.Diagnostics;
namespace scan
{
public partial class Form1 : Form
{
string addr = "";//放ip地址
int port;//放端口号
Thread scanthread;//定义一个子线程
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
//子进程要使用父进程的控件时,要加这一句
}
private void button1_Click(object sender, EventArgs e)//扫描按钮
{
//创建主进程,从portscan函数开始执行
Thread process = new Thread(new ThreadStart(portscan));
process.Start();//启动进程
progressBar1.Minimum = 0;//最小值
progressBar1.Maximum = 1000;//最大值
listBox1.Items.Clear();//列表.项.清空
listBox1.Items.Add("扫描器v1.0");
listBox1.Items.Add("");//加空行
}
private void portscan()//一个进程分配为1000个子线程
{
listBox1.Items.Add("开始扫描,可能要等几分钟");
addr = textBox1.Text;//取出ip地址
for(int i=1;i<=1000;i++)//创建1000个子线程
{
port = i;
scanthread = new Thread(new ThreadStart(scan));
scanthread.Start();
System.Threading.Thread.Sleep(10);//每隔10ms,启动一个子线程
label2.Text = port.ToString();//label2提示当前扫描到哪个端口号了;port转换成字符串了
progressBar1.Value = port;//进度条
}
}
private void scan()
{
int i = port;
TcpClient myclient = null;
try//如果执行try子句出错,就跳到catch执行;正确则顺利执行
{
myclient = new TcpClient();
myclient.Connect(addr, port);//端口连接
listBox1.Items.Add("端口" + port.ToString() + "开放");
}
catch
{
if(i==1000)
{
listBox1.Items.Add("扫描结束!");
}
}
}
private void button2_Click(object sender, EventArgs e)//退出按钮
{
System.Environment.Exit(0);//父进程和子进程都退出
}
}
}