最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C#實(shí)現(xiàn)端口掃描器(單線程和多線程)

 更新時(shí)間:2022年07月27日 16:05:48   作者:Baker_Streets  
本文主要介紹了基于C#分別通過(guò)單線程和多線程實(shí)現(xiàn)端口掃描,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、新建項(xiàng)目并設(shè)置界面

新建項(xiàng)目:

選擇Windows窗體項(xiàng)目應(yīng)用(.Net Framework):

設(shè)置項(xiàng)目名和路徑:

新建項(xiàng)目如下:

設(shè)置界面:

將tbShow設(shè)置為只讀:

二、單線程實(shí)現(xiàn)端口掃描

1. 編寫代碼

雙擊按鈕,編寫其點(diǎn)擊事件:

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 Scan
{
    public partial class Form1 : Form
    {


        //主機(jī)地址
        private string hostAddress;
        //起始端口
        private int start;
        //終止端口
        private int end;
        //端口號(hào)
        private int port;
        //定義線程對(duì)象
        private Thread scanThread;
        

        public Form1()
        {
            InitializeComponent();
        }

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

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

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

                    //顯示框顯示
                    tbShow.AppendText("端口掃描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
                    //調(diào)用端口掃描函數(shù)
                    PortScan();
                }
                else
                {
                	//若端口號(hào)不合理,彈窗報(bào)錯(cuò)
                    MessageBox.Show("輸入錯(cuò)誤,端口范圍為[0-65536]!");
                }
            }
            catch
            {
				//若輸入的端口號(hào)為非整型,則彈窗報(bào)錯(cuò)
                MessageBox.Show("輸入錯(cuò)誤,端口范圍為[0-65536]!");
            }
        }

        /// <summary>
        /// 判斷端口是否合理
        /// </summary>
        /// <returns></returns>
        private bool decideAddress()
        {
            //判斷端口號(hào)是否合理
            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("開始掃描...(可能需要請(qǐng)您等待幾分鐘)" + 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();
                //進(jìn)度條值改變
                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>
        /// 掃描某個(gè)端口
        /// </summary>
        private void Scan()
        {
            int portnow = port;
            //創(chuàng)建TcpClient對(duì)象,TcpClient用于為TCP網(wǎng)絡(luò)服務(wù)提供客戶端連接
            TcpClient objTCP = null;
            try
            {
                //用于TcpClient對(duì)象掃描端口
                objTCP = new TcpClient(hostAddress, portnow);
                //掃描到則顯示到顯示框
                tbShow.AppendText("端口 " + port + " 開放!" + Environment.NewLine);
            }
            catch
            {
                //未掃描到,則會(huì)拋出錯(cuò)誤
            }
        }


    }
}

2. 運(yùn)行結(jié)果

可發(fā)現(xiàn)速度十分緩慢,且不能拖拽。

三、多線程實(shí)現(xiàn)端口掃描

1. 編寫代碼

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 Scan
{
    public partial class Form1 : Form
    {


        //主機(jī)地址
        private string hostAddress;
        //起始端口
        private int start;
        //終止端口
        private int end;
        //端口號(hào)
        private int port;
        //定義線程對(duì)象
        private Thread scanThread;
        //定義端口狀態(tài)數(shù)據(jù)(開放則為true,否則為false)
        private bool[] done = new bool[65526];
        private bool OK;


        public Form1()
        {
            InitializeComponent();
            //不進(jìn)行跨線程檢查
            CheckForIllegalCrossThreadCalls = false;
        }

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

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

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

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

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

        /// <summary>
        /// 判斷端口是否合理
        /// </summary>
        /// <returns></returns>
        private bool decideAddress()
        {
            //判斷端口號(hào)是否合理
            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("開始掃描...(可能需要請(qǐng)您等待幾分鐘)" + 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);
                //進(jìn)度條值改變
                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>
        /// 掃描某個(gè)端口
        /// </summary>
        private void Scan()
        {
            int portnow = port;
            //創(chuàng)建線程變量
            Thread Threadnow = scanThread;
            //掃描端口,成功則寫入信息
            done[portnow] = true;
            //創(chuàng)建TcpClient對(duì)象,TcpClient用于為TCP網(wǎng)絡(luò)服務(wù)提供客戶端連接
            TcpClient objTCP = null;
            try
            {
                //用于TcpClient對(duì)象掃描端口
                objTCP = new TcpClient(hostAddress, portnow);
                //掃描到則顯示到顯示框
                tbShow.AppendText("端口 " + port + " 開放!" + Environment.NewLine);
            }
            catch
            {
                //未掃描到,則會(huì)拋出錯(cuò)誤
            }
        }


    }
}

2. 運(yùn)行結(jié)果

可發(fā)現(xiàn)速度明顯變快,且能拖拽窗口。

四、總結(jié)

多線程可以提高CPU的利用率。

參考

C#單線程和多線程的應(yīng)用比較:端口掃描器

以上就是基于C#實(shí)現(xiàn)端口掃描器(單線程和多線程)的詳細(xì)內(nèi)容,更多關(guān)于C# 端口掃描器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#初學(xué)簡(jiǎn)單程序?qū)嵗a介紹

    c#初學(xué)簡(jiǎn)單程序?qū)嵗a介紹

    這篇文章介紹了c#初學(xué)簡(jiǎn)單程序?qū)嵗a,有需要的朋友可以參考一下
    2013-10-10
  • C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù)

    C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù)

    本文主要介紹了C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#調(diào)用新浪微博API實(shí)例代碼

    C#調(diào)用新浪微博API實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于C#調(diào)用微博API的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • c#?定期重啟程序操作的實(shí)現(xiàn)

    c#?定期重啟程序操作的實(shí)現(xiàn)

    本文主要介紹了c#?定期重啟程序操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • WPF數(shù)據(jù)綁定時(shí)出現(xiàn)StringFormat失效的原因和解決方法

    WPF數(shù)據(jù)綁定時(shí)出現(xiàn)StringFormat失效的原因和解決方法

    在數(shù)據(jù)綁定過(guò)程中,我們經(jīng)常會(huì)使用StringFormat對(duì)要顯示的數(shù)據(jù)進(jìn)行格式化,以便獲得更為直觀的展示效果,但在某些情況下格式化操作并未生效,所以本文介紹了WPF數(shù)據(jù)綁定時(shí)出現(xiàn)StringFormat失效的原因和解決方法,需要的朋友可以參考下
    2024-12-12
  • 詳解C#如何為某個(gè)方法設(shè)定執(zhí)行超時(shí)時(shí)間

    詳解C#如何為某個(gè)方法設(shè)定執(zhí)行超時(shí)時(shí)間

    這篇文章主要為大家詳細(xì)介紹一下C#如何為某個(gè)方法設(shè)定執(zhí)行超時(shí)時(shí)間,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以學(xué)習(xí)一下
    2023-10-10
  • C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中

    C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中

    這篇文章主要給大家介紹C#.net中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中,本文涉及到C#.net中批量插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中方面的內(nèi)容,對(duì)C#.net批量插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中感興趣的朋友可以參考下本篇文章
    2015-10-10
  • C#控制臺(tái)下測(cè)試多線程的方法

    C#控制臺(tái)下測(cè)試多線程的方法

    這篇文章主要介紹了C#控制臺(tái)下測(cè)試多線程的方法,涉及C#操作多線程的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • LINQ基礎(chǔ)之From和GroupBy子句

    LINQ基礎(chǔ)之From和GroupBy子句

    這篇文章介紹了LINQ使用From和GroupBy子句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)矩陣乘法的方法,實(shí)例分析了通過(guò)C#數(shù)組構(gòu)造矩陣及實(shí)現(xiàn)矩陣乘法的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

西城区| 宁乡县| 长顺县| 平定县| 四子王旗| 山西省| 响水县| 望谟县| 天全县| 兰溪市| 岗巴县| 江西省| 巧家县| 青海省| 林甸县| 鄂托克旗| 方正县| 鸡西市| 佳木斯市| 鹤山市| 定日县| 平乡县| 嘉义市| 乐清市| 聂荣县| 佛学| 新龙县| 历史| 油尖旺区| 旅游| 通化市| 谷城县| 曲松县| 平泉县| 营山县| 绥江县| 富平县| 商洛市| 囊谦县| 娄底市| 朔州市|