天天看點

TCP程式設計-端口掃描器與網遊用戶端

一、多線程方式進行端口掃描

(一)使用多線程的優勢:

1、提高系統的吞吐率。多線程程式設計使得一個程序中可以有多個并發的操作。

2、提高響應性。

3、充分利用多核處理器資源。

4、最小化對系統資源的使用。

5、簡化程式的結構。

(二)代碼編寫

使用軟體:vs2017

語言:C#

完整代碼:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
namespace PortScanner
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.TextBox txtAddr;
        private System.Windows.Forms.TextBox txtStart;
        private System.Windows.Forms.TextBox txtEnd;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Splitter splitter1;
        private System.Windows.Forms.ListBox lbResult;
        private System.Windows.Forms.Button btnScan;
        private System.Windows.Forms.ProgressBar progressBar1;
        private System.Windows.Forms.Label lblStart;
        private System.Windows.Forms.Label lblStop;
        private System.Windows.Forms.Label lblNow;
        //自定義變量
        private int port;
        private string Addr;
        private bool[] done = new bool[65536];
        private int start;
        private int end;
        private Thread scanThread;
        private bool OK;
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//設定該屬性 為false
        }
        private void InitializeComponent()
        {
            this.lbResult = new System.Windows.Forms.ListBox();
            this.txtAddr = new System.Windows.Forms.TextBox();
            this.txtStart = new System.Windows.Forms.TextBox();
            this.txtEnd = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.splitter1 = new System.Windows.Forms.Splitter();
            this.btnScan = new System.Windows.Forms.Button();
            this.progressBar1 = new System.Windows.Forms.ProgressBar();
            this.lblStart = new System.Windows.Forms.Label();
            this.lblStop = new System.Windows.Forms.Label();
            this.lblNow = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // lbResult
            // 
            this.lbResult.Dock = System.Windows.Forms.DockStyle.Right;
            this.lbResult.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.lbResult.ItemHeight = 14;
            this.lbResult.Location = new System.Drawing.Point(224, 0);
            this.lbResult.Name = "lbResult";
            this.lbResult.Size = new System.Drawing.Size(264, 273);
            this.lbResult.TabIndex = 0;
            this.lbResult.SelectedIndexChanged += new System.EventHandler(this.lbResult_SelectedIndexChanged);
            // 
            // txtAddr
            // 
            this.txtAddr.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.txtAddr.Location = new System.Drawing.Point(72, 16);
            this.txtAddr.Name = "txtAddr";
            this.txtAddr.Size = new System.Drawing.Size(136, 22);
            this.txtAddr.TabIndex = 1;
            // 
            // txtStart
            // 
            this.txtStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.txtStart.Location = new System.Drawing.Point(72, 48);
            this.txtStart.Name = "txtStart";
            this.txtStart.Size = new System.Drawing.Size(136, 22);
            this.txtStart.TabIndex = 2;
            this.txtStart.TextChanged += new System.EventHandler(this.txtStart_TextChanged);
            // 
            // txtEnd
            // 
            this.txtEnd.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.txtEnd.Location = new System.Drawing.Point(72, 80);
            this.txtEnd.Name = "txtEnd";
            this.txtEnd.Size = new System.Drawing.Size(136, 22);
            this.txtEnd.TabIndex = 3;
            this.txtEnd.TextChanged += new System.EventHandler(this.txtEnd_TextChanged);
            // 
            // label1
            // 
            this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label1.Location = new System.Drawing.Point(8, 16);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(64, 23);
            this.label1.TabIndex = 4;
            this.label1.Text = "主機位址";
            // 
            // label2
            // 
            this.label2.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label2.Location = new System.Drawing.Point(8, 80);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(64, 23);
            this.label2.TabIndex = 5;
            this.label2.Text = "結束端口";
            // 
            // label3
            // 
            this.label3.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label3.Location = new System.Drawing.Point(8, 48);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(64, 23);
            this.label3.TabIndex = 6;
            this.label3.Text = "起始端口";
            // 
            // splitter1
            // 
            this.splitter1.Dock = System.Windows.Forms.DockStyle.Right;
            this.splitter1.Location = new System.Drawing.Point(221, 0);
            this.splitter1.Name = "splitter1";
            this.splitter1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
            this.splitter1.Size = new System.Drawing.Size(3, 273);
            this.splitter1.TabIndex = 7;
            this.splitter1.TabStop = false;
            // 
            // btnScan
            // 
            this.btnScan.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnScan.Location = new System.Drawing.Point(72, 200);
            this.btnScan.Name = "btnScan";
            this.btnScan.Size = new System.Drawing.Size(75, 23);
            this.btnScan.TabIndex = 8;
            this.btnScan.Text = "掃描";
            this.btnScan.Click += new System.EventHandler(this.btnScan_Click);
            // 
            // progressBar1
            // 
            this.progressBar1.Location = new System.Drawing.Point(8, 112);
            this.progressBar1.Name = "progressBar1";
            this.progressBar1.Size = new System.Drawing.Size(200, 23);
            this.progressBar1.Step = 1;
            this.progressBar1.TabIndex = 9;
            // 
            // lblStart
            // 
            this.lblStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.lblStart.Location = new System.Drawing.Point(8, 144);
            this.lblStart.Name = "lblStart";
            this.lblStart.Size = new System.Drawing.Size(48, 23);
            this.lblStart.TabIndex = 10;
            // 
            // lblStop
            // 
            this.lblStop.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.lblStop.Location = new System.Drawing.Point(160, 144);
            this.lblStop.Name = "lblStop";
            this.lblStop.Size = new System.Drawing.Size(48, 23);
            this.lblStop.TabIndex = 11;
            // 
            // lblNow
            // 
            this.lblNow.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.lblNow.Location = new System.Drawing.Point(84, 144);
            this.lblNow.Name = "lblNow";
            this.lblNow.Size = new System.Drawing.Size(48, 23);
            this.lblNow.TabIndex = 12;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
            this.ClientSize = new System.Drawing.Size(488, 273);
            this.Controls.Add(this.lblNow);
            this.Controls.Add(this.lblStop);
            this.Controls.Add(this.lblStart);
            this.Controls.Add(this.progressBar1);
            this.Controls.Add(this.btnScan);
            this.Controls.Add(this.splitter1);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.txtEnd);
            this.Controls.Add(this.txtStart);
            this.Controls.Add(this.txtAddr);
            this.Controls.Add(this.lbResult);
            this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.Name = "Form1";
            this.Text = "端口掃描器";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        private void lbResult_SelectedIndexChanged(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        [STAThread]
        static void Main()
        {
            // Control.CheckForIllegalCrossThreadCalls = false;
            Application.Run(new Form1());
        }

        private void txtStart_TextChanged(object sender, System.EventArgs e)
        {
            //擷取輸入的起始端口值
            lblStart.Text = txtStart.Text;
        }
        private void txtEnd_TextChanged(object sender, System.EventArgs e)
        {
            //擷取輸入的接受端口值
            lblStop.Text = txtEnd.Text;
        }
        private void btnScan_Click(object sender, System.EventArgs e)
        {
            //建立線程,并建立ThreadStart委托對象
            Thread process = new Thread(new ThreadStart(PortScan));
            process.Start();
            //顯示端口掃描的範圍
            progressBar1.Minimum = Int32.Parse(txtStart.Text);
            progressBar1.Maximum = Int32.Parse(txtEnd.Text);
            //顯示框初始化
            lbResult.Items.Clear();
            lbResult.Items.Add("端口掃描器 v1.0.");
            lbResult.Items.Add("");
        }
        private void PortScan()
        {
            start = Int32.Parse(txtStart.Text);
            end = Int32.Parse(txtEnd.Text);
            //檢查輸入範圍合法性
            if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
            {
                lbResult.Items.Add("開始掃描... (可能需要請您等待幾分鐘)");
                Addr = txtAddr.Text;
                for (int i = start; i <= end; i++)
                {
                    port = i;
                    //使用該端口的掃描線程
                    scanThread = new Thread(new ThreadStart(Scan));
                    scanThread.Start();
                    //使線程睡眠
                    System.Threading.Thread.Sleep(100);
                    progressBar1.Value = i;
                    lblNow.Text = i.ToString();
                }
                //未完成時情況
                while (!OK)
                {
                    OK = true;
                    for (int i = start; i <= end; i++)
                    {
                        if (!done[i])
                        {
                            OK = false;
                            break;
                        }
                    }
                    System.Threading.Thread.Sleep(1000);
                }
                lbResult.Items.Add("掃描結束!");
            }
            else
            {
                MessageBox.Show("輸入錯誤,端口範圍為[0-65536]");
            }
        }
        private void Scan()
        {
            int portnow = port;
            //建立線程變量
            Thread Threadnow = scanThread;
            done[portnow] = true;
            //建立TcpClient對象,TcpClient用于為TCP網絡服務提供用戶端連接配接
            TcpClient objTCP = null;
            //掃描端口,成功則寫入資訊
            try
            {
                //用TcpClient對象掃描端口
                objTCP = new TcpClient(Addr, portnow);
                lbResult.Items.Add("端口 " + portnow.ToString() + " 開放!");
            }
            catch
            {
            }
        }


    }
}
           

若編譯出現以下錯誤:

TCP程式設計-端口掃描器與網遊用戶端

在Form1中添加:

public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//設定該屬性 為false
        }
           

編譯通過後程式展示:

TCP程式設計-端口掃描器與網遊用戶端
TCP程式設計-端口掃描器與網遊用戶端

二、編寫一個網遊用戶端

說明:采用tcp連接配接的方式

(一)伺服器的連接配接

InitializeComponent();
            IPAddress ipaddress = IPAddress.Parse("10.160.52.106");
            EndPoint point = new IPEndPoint(ipaddress, 3900);
            tcpClient.Connect(point);
           

(二) 連接配接成功後,可以将伺服器發來的消息不停地顯示在 listbox 中;

TCP程式設計-端口掃描器與網遊用戶端
TCP程式設計-端口掃描器與網遊用戶端

(三) 用戶端要發給伺服器的資料,通過 textbox輸入 或者點選button

byte[] sendBytes = Encoding.Default.GetBytes(textBox1.Text+"\n");
                    tcpClient.Send(sendBytes);
           
TCP程式設計-端口掃描器與網遊用戶端
TCP程式設計-端口掃描器與網遊用戶端

(四)每隔三十秒更換一次背景

pictureBox1.Image = Image.FromFile("./" + num.ToString() + ".jpg");
            num++;
            //實列化
            System.Windows.Forms.Timer mytimer = new System.Windows.Forms.Timer();
            //給timer綁定一個事件
            mytimer.Tick += new EventHandler(change_Pic);
            mytimer.Enabled = true;
           

繼續閱讀