程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 利用C#設計端口掃描器

利用C#設計端口掃描器

編輯:C#基礎知識

  上網很久的朋友一定對端口掃描器不會陌生吧。XScanner,SuperScanner大家一定都使用過。

  今天我們就用最新的.Net技術來制作一個自己的端口掃描器!

  今天主要使用到的是System.Net和System.Threading名稱空間.

1
2using System;
3using System.Collections.Generic;
4using System.Text;
5
6using System.Net;
7using System.Net.Sockets;
8
9using System.Threading;
10
11namespace PortScanner
12{
13 class Program
14 {
15  //已掃描端口數目
16  internal static int scannedCount = 0;
17  //正在運行的線程數目
18  internal static int runningThreadCount = 0;
19  //打開的端口數目
20  internal static List<int> openedPorts = new List<int>();
21  //起始掃描端口
22  static int startPort = 1;
23  //結束端口號
24  static int endPort = 500;
25  //最大工作線程數
26  static int maxThread = 100;
27  static void Main(string[] args)
28  {
29   //接收傳入參數一作為要掃描的主機
30   string host = args[0];
31   //接收傳入參數二作為端口掃描范圍,如1-4000
32   string portRange = args[1];
33   startPort = int.Parse(portRange.Split('-')[0].Trim());
34   endPort = int.Parse(portRange.Split('-')[1].Trim());
35
36   for (int port = startPort; port < endPort; port++)
37   {
38    //創建掃描類
39    Scanner scanner = new Scanner(host, port);
40    Thread thread = new Thread(new ThreadStart(scanner.Scan));
41    thread.Name = port.ToString();
42    thread.IsBackground = true;
43    //啟動掃描線程
44    thread.Start();
45
46    runningThreadCount++;
47
48    Thread.Sleep(10);
49    //循環,直到某個線程工作完畢才啟動另一新線程,也可以叫做推拉窗技術
50    while (runningThreadCount >= maxThread) ;
51   }
52
53   //空循環,直到所有端口掃描完畢
54   while (scannedCount + 1 < (endPort - startPort)) ;
55
56    Console.WriteLine();
57    Console.WriteLine();
58    //輸出結果
59    Console.WriteLine("Scan for host: {0} has been completed ,
total {1} ports scanned,
opened ports :{2}",
60 host, (endPort - startPort), openedPorts.Count);
61
62   foreach (int port in openedPorts)
63    Console.WriteLine("  Port: {0} is open", port.ToString().PadLeft(6));
64  }
65 }
66
67 //掃描類
68 class Scanner
69 {
70  string m_host;
71  int m_port;
72 
73  public Scanner(string host, int port)
74  {
75   m_host = host; m_port = port;
76  }
77
78  public void Scan()
79  {
80   //我們直接使用比較高級的TcpClient類
81   TcpClient tc = new TcpClient();
82   //設置超時時間
83   tc.SendTimeout = tc.ReceiveTimeout = 2000;
84   try
85   {
86    //Console.Write("Checking port: {0}", m_port);
87    //嘗試連接
88    tc.Connect(m_host, m_port);
89    if (tc.Connected)
90    {
91     //如果連接上,證明此商品為開放狀態
92     Console.WriteLine("Port {0} is Open", m_port.ToString().PadRight(6));
93     Program.openedPorts.Add(m_port);
94    }
95   }
96   catch (System.Net.Sockets.SocketException e)
97   {
98    //容錯處理
99    Console.WriteLine("Port {0} is closed", m_port.ToString().PadRight(6));
100    //Console.WriteLine(e.Message);
101   }
102   finally
103   {
104    tc.Close();
105    tc = null;
106    Program.scannedCount++;
107    Program.runningThreadCount--;
108
109    //Console.WriteLine(Program.scannedCount);
110  
111   }
112  }
113 }
114}
115
116
117

  好了,代碼很簡單吧!只能掃描TCP端口哦。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved