C#掃描計算機端口
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace PortScanner { class Program { //已掃描端口數目 internal static int scannedCount = 0; //正在運行的線程數目 internal static int runningThreadCount = 0; //打開的端口數目 internal static List<int> openedPorts = new List<int>(); //起始掃描端口 static int startPort = 1; //結束端口號 static int endPort = 500; //最大工作線程數 static int maxThread = 10; static void Main(string[] args) { //接收傳入參數一作為要掃描的主機 string host = "192.168.0.1"; //接收傳入參數二作為端口掃描範圍,如1-4000 string portRange = "1-400"; startPort = int.Parse(portRange.Split('-')[0].Trim()); endPort = int.Parse(portRange.Split('-')[1].Trim()); for (int port = startPort; port < endPort; port++) { //創建掃描類 Scanner scanner = new Scanner(host, port); Thread thread = new Thread(new ThreadStart(scanner.Scan)); thread.Name = port.ToString(); thread.IsBackground = true; //啟動掃描線程 thread.Start(); runningThreadCount++; Thread.Sleep(10); //循環,直到某個線程工作完畢才啟動另一新線程,也可以叫做推拉窗技術 while (runningThreadCount >= maxThread) ; } //空循環,直到所有端口掃描完畢 while (scannedCount + 1 < (endPort - startPort)) ; Console.WriteLine(); Console.WriteLine(); //輸出結果 Console.WriteLine("Scan for host: {0} has been completed , /n total {1} ports scanned, /nopened ports :{2}", host, (endPort - startPort), openedPorts.Count); foreach (int port in openedPorts) Console.WriteLine("/tPort: {0} is open", port.ToString().PadLeft(6)); } } //掃描類 class Scanner { string m_host; int m_port; public Scanner(string host, int port) { m_host = host; m_port = port; } public void Scan() { //我們直接使用比較高級的TcpClient類 TcpClient tc = new TcpClient(); //設置超時時間 tc.SendTimeout = tc.ReceiveTimeout = 2000; try { //Console.Write("Checking port: {0}", m_port); //嚐試連接 tc.Connect(m_host, m_port); if (tc.Connected) { //如果連接上,證明此端口為開放狀態 Console.WriteLine("Port {0} is Open", m_port.ToString().PadRight(6)); Program.openedPorts.Add(m_port); } } catch (System.Net.Sockets.SocketException e) { //容錯處理 Console.WriteLine("Port {0} is closed", m_port.ToString().PadRight(6)); //Console.WriteLine(e.Message); } finally { tc.Close(); tc = null; Program.scannedCount++; Program.runningThreadCount--; //Console.WriteLine(Program.scannedCount); } } } }
最後更新:2017-04-02 04:01:44