溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#端口掃描器如何編寫

發(fā)布時間:2022-07-28 09:46:11 來源:億速云 閱讀:134 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“C#端口掃描器如何編寫”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“C#端口掃描器如何編寫”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

一、項目設(shè)計

新建項目

C#端口掃描器如何編寫

整體設(shè)計

C#端口掃描器如何編寫

最終設(shè)計

C#端口掃描器如何編寫

二、單線程

1.代碼編寫

button

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace duankou
{
    public partial class Form1 : Form
    {

        private string hostAddress;
        //起始端口
        private int start;
        //終止端口
        private int end;
        //端口號
        private int port;
        //定義線程對象
        private Thread scanThread;
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //初始化
                tbShow.Clear();
                lb.Text = "0%";

                //獲取ip地址和始末端口號
                hostAddress = tbHost.Text;
                start = Int32.Parse(tbSPort.Text);
                end = Int32.Parse(tbEPort.Text);

                if (decideAddress()) // 端口合理
                {
                    //讓輸入的textbox只讀,無法改變
                    tbHost.ReadOnly = true;
                    tbSPort.ReadOnly = true;
                    tbEPort.ReadOnly = true;
                    //設(shè)置進度條的范圍
                    pb.Minimum = start;
                    pb.Maximum = end;

                    //顯示框顯示
                    tbShow.AppendText("端口掃描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
                    //調(diào)用端口掃描函數(shù)
                    PortScan();
                }
                else
                {
                    //若端口號不合理,彈窗報錯
                    MessageBox.Show("輸入錯誤,端口范圍為[0-65536]!");
                }
            }
            catch
            {
                //若輸入的端口號為非整型,則彈窗報錯
                MessageBox.Show("輸入錯誤,端口范圍為[0-65536]!");
            }
        }
        /// <summary>
        /// 判斷端口是否合理
        /// </summary>
        /// <returns></returns>
        private bool decideAddress()
        {
            //判斷端口號是否合理
            if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
                return true;
            else
                return false;
        }
        private void PortScan()
        {
            double x;
            string xian;
            //顯示掃描狀態(tài)
            tbShow.AppendText("開始掃描...(可能需要請您等待幾分鐘)" + Environment.NewLine + Environment.NewLine);
            //循環(huán)拋出線程掃描端口
            for (int i = start; i <= end; i++)
            {
                x = (double)(i - start + 1) / (end - start + 1);
                xian = x.ToString("0%");
                port = i;
                //調(diào)用端口i的掃描操作
                Scan();
                //進度條值改變
                lb.Text = xian;
                lb.Refresh();
                pb.Value = i;
            }
            tbShow.AppendText(Environment.NewLine + "掃描結(jié)束!" + Environment.NewLine);
            //輸入框textbox只讀屬性取消
            tbHost.ReadOnly = false;
            tbSPort.ReadOnly = false;
            tbEPort.ReadOnly = false;
        }

        /// <summary>
        /// 掃描某個端口
        /// </summary>
        private void Scan()
        {
            int portnow = port;
            //創(chuàng)建TcpClient對象,TcpClient用于為TCP網(wǎng)絡(luò)服務(wù)提供客戶端連接
            TcpClient objTCP = null;
            try
            {
                //用于TcpClient對象掃描端口
                objTCP = new TcpClient(hostAddress, portnow);
                //掃描到則顯示到顯示框
                tbShow.AppendText("端口 " + port + " 開放!" + Environment.NewLine);
            }
            catch
            {
                //未掃描到,則會拋出錯誤
            }
        }

    }
}

2.掃描結(jié)果

開始

C#端口掃描器如何編寫

1分鐘結(jié)束 沒有端口開放

C#端口掃描器如何編寫

三、多線程

1.代碼編寫

button

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace duankou
{
    public partial class Form1 : Form
    {

        private string hostAddress;
        //起始端口
        private int start;
        //終止端口
        private int end;
        //端口號
        private int port;
        //定義線程對象
        private Thread scanThread;
        //定義端口狀態(tài)數(shù)據(jù)(開放則為true,否則為false)
        private bool[] done = new bool[65526];
        private bool OK;
        public Form1()
        {
            InitializeComponent();
            //不進行跨線程檢查
            CheckForIllegalCrossThreadCalls = false;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //初始化
                tbShow.Clear();
                lb.Text = "0%";

                //獲取ip地址和始末端口號
                hostAddress = tbHost.Text;
                start = Int32.Parse(tbSPort.Text);
                end = Int32.Parse(tbEPort.Text);

                if (decideAddress()) // 端口合理
                {
                    //讓輸入的textbox只讀,無法改變
                    tbHost.ReadOnly = true;
                    tbSPort.ReadOnly = true;
                    tbEPort.ReadOnly = true;
                    //創(chuàng)建線程,并創(chuàng)建ThreadStart委托對象
                    Thread process = new Thread(new ThreadStart(PortScan));
                    process.Start();
                    //設(shè)置進度條的范圍
                    pb.Minimum = start;
                    pb.Maximum = end;

                    //顯示框顯示
                    tbShow.AppendText("端口掃描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
                }
                else
                {
                    //若端口號不合理,彈窗報錯
                    MessageBox.Show("輸入錯誤,端口范圍為[0-65536]!");
                }

            }
            catch
            {
                //若輸入的端口號為非整型,則彈窗報錯
                MessageBox.Show("輸入錯誤,端口范圍為[0-65536]!");
            }

        }
        /// <summary>
        /// 判斷端口是否合理
        /// </summary>
        /// <returns></returns>
        private bool decideAddress()
        {
            //判斷端口號是否合理
            if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
                return true;
            else
                return false;
        }
        private void PortScan()
        {
            double x;
            string xian;
            //顯示掃描狀態(tài)
            tbShow.AppendText("開始掃描...(可能需要請您等待幾分鐘)" + Environment.NewLine + Environment.NewLine);
            //循環(huán)拋出線程掃描端口
            for (int i = start; i <= end; i++)
            {
                x = (double)(i - start + 1) / (end - start + 1);
                xian = x.ToString("0%");
                port = i;
                //使用該端口的掃描線程
                scanThread = new Thread(new ThreadStart(Scan));
                scanThread.Start();
                //使線程睡眠
                System.Threading.Thread.Sleep(100);
                //進度條值改變
                lb.Text = xian;
                pb.Value = i;
            }
            while (!OK)
            {
                OK = true;
                for (int i = start; i <= end; i++)
                {
                    if (!done[i])
                    {
                        OK = false;
                        break;
                    }
                }
                System.Threading.Thread.Sleep(1000);
            }
            tbShow.AppendText(Environment.NewLine + "掃描結(jié)束!" + Environment.NewLine);
            //輸入框textbox只讀屬性取消
            tbHost.ReadOnly = false;
            tbSPort.ReadOnly = false;
            tbEPort.ReadOnly = false;
        }

        /// <summary>
        /// 掃描某個端口
        /// </summary>
        private void Scan()
        {
            int portnow = port;
            //創(chuàng)建線程變量
            Thread Threadnow = scanThread;
            //掃描端口,成功則寫入信息
            done[portnow] = true;
            //創(chuàng)建TcpClient對象,TcpClient用于為TCP網(wǎng)絡(luò)服務(wù)提供客戶端連接
            TcpClient objTCP = null;
            try
            {
                //用于TcpClient對象掃描端口
                objTCP = new TcpClient(hostAddress, portnow);
                //掃描到則顯示到顯示框
                tbShow.AppendText("端口 " + port + " 開放!" + Environment.NewLine);
            }
            catch
            {
                //未掃描到,則會拋出錯誤
            }
        }

    }
}

2.掃描結(jié)果

開始

C#端口掃描器如何編寫

5秒結(jié)束

C#端口掃描器如何編寫

讀到這里,這篇“C#端口掃描器如何編寫”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI