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 , \n total {1} ports scanned, \nopened ports :{2}", 60 host, (endPort - startPort), openedPorts.Count); 61 62 foreach (int port in openedPorts) 63 Console.WriteLine("\tPort: {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 |
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛
https://bbs.txwb.com
关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩
|
本文来源:vczx 作者:佚名