C#扫描指定IP端口

来源:互联网 发布:python 顶级黑客 编辑:程序博客网 时间:2024/06/01 13:11
//===========================================================//    C# 实现端口扫描//===========================================================using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace ConApp{    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 = 100;        static void Main(string[] args)        {            //简单提示            Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////");            Console.WriteLine("//   Writer;Feeling");            Console.WriteLine("////////////////////////////////////////////////////////////////////////////////////");            Console.WriteLine("请输入要扫描的主机;");            string host = Console.ReadLine();            Console.WriteLine("请输入扫描的端口 例如:1-800");            string portRange = Console.ReadLine();            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, \n opened ports:{2}", host, (endPort - startPort), openedPorts.Count);            foreach (int port in openedPorts)            {                Console.WriteLine("\tport: {0} is open", port.ToString().PadLeft(6));            }            Console.ReadLine();        }    }    class Scanner    {        string m_host;        int m_port;        public Scanner(string host, int port)        {            m_host = host;            m_port = port;        }        public void Scan()        {            TcpClient tc = new TcpClient();            tc.SendTimeout = tc.ReceiveTimeout = 2000;            try            {                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            {                Console.WriteLine("Port {0} is Closed", m_port.ToString().PadRight(6));            }            finally            {                tc.Close();                tc = null;                Program.scannedCount++;                Program.runningThreadCount--;            }        }    }}

原文地址: http://www.cnblogs.com/wugang/archive/2012/10/26/2740885.html