利用C#设计端口扫描器

  1. 上网很久的朋友一定对端口扫描器不会陌生吧。XScanner,SuperScanner大家一定都使用过。
  2.   今天我们就用最新的.net技术来制作一个自己的端口扫描器! 
  3.   今天主要使用到的是System.Net和System.Threading名称空间.
  4. 1
  5. 2using System;
  6. 3using System.Collections.Generic;
  7. 4using System.Text;
  8. 5
  9. 6using System.Net;
  10. 7using System.Net.Sockets;
  11. 8
  12. 9using System.Threading;
  13. 10
  14. 11namespace PortScanner
  15. 12{
  16. 13 class Program
  17. 14 {
  18. 15  //已扫描端口数目
  19. 16  internal static int scannedCount = 0;
  20. 17  //正在运行的线程数目
  21. 18  internal static int runningThreadCount = 0;
  22. 19  //打开的端口数目
  23. 20  internal static List<int> openedPorts = new List<int>();
  24. 21  //起始扫描端口
  25. 22  static int startPort = 1;
  26. 23  //结束端口号
  27. 24  static int endPort = 500;
  28. 25  //最大工作线程数
  29. 26  static int maxThread = 100;
  30. 27  static void Main(string[] args)
  31. 28  {
  32. 29   //接收传入参数一作为要扫描的主机
  33. 30   string host = args[0];
  34. 31   //接收传入参数二作为端口扫描范围,如1-4000
  35. 32   string portRange = args[1];
  36. 33   startPort = int.Parse(portRange.Split('-')[0].Trim());
  37. 34   endPort = int.Parse(portRange.Split('-')[1].Trim());
  38. 35
  39. 36   for (int port = startPort; port < endPort; port++)
  40. 37   {
  41. 38    //创建扫描类
  42. 39    Scanner scanner = new Scanner(host, port);
  43. 40    Thread thread = new Thread(new ThreadStart(scanner.Scan));
  44. 41    thread.Name = port.ToString();
  45. 42    thread.IsBackground = true;
  46. 43    //启动扫描线程
  47. 44    thread.Start();
  48. 45
  49. 46    runningThreadCount++;
  50. 47
  51. 48    Thread.Sleep(10);
  52. 49    //循环,直到某个线程工作完毕才启动另一新线程,也可以叫做推拉窗技术
  53. 50    while (runningThreadCount >= maxThread) ;
  54. 51   }
  55. 52
  56. 53   //空循环,直到所有端口扫描完毕
  57. 54   while (scannedCount + 1 < (endPort - startPort)) ;
  58. 55
  59. 56    Console.WriteLine();
  60. 57    Console.WriteLine();
  61. 58    //输出结果
  62. 59    Console.WriteLine("Scan for host: {0} has been completed , /n total {1} ports scanned, /nopened ports :{2}",
  63. 60 host, (endPort - startPort), openedPorts.Count);
  64. 61
  65. 62   foreach (int port in openedPorts)
  66. 63    Console.WriteLine("/tPort: {0} is open", port.ToString().PadLeft(6));
  67. 64  }
  68. 65 }
  69. 66
  70. 67 //扫描类
  71. 68 class Scanner
  72. 69 {
  73. 70  string m_host;
  74. 71  int m_port;
  75. 72 
  76. 73  public Scanner(string host, int port)
  77. 74  {
  78. 75   m_host = host; m_port = port;
  79. 76  }
  80. 77
  81. 78  public void Scan()
  82. 79  {
  83. 80   //我们直接使用比较高级的TcpClient类
  84. 81   TcpClient tc = new TcpClient();
  85. 82   //设置超时时间
  86. 83   tc.SendTimeout = tc.ReceiveTimeout = 2000;
  87. 84   try
  88. 85   {
  89. 86    //Console.Write("Checking port: {0}", m_port);
  90. 87    //尝试连接
  91. 88    tc.Connect(m_host, m_port);
  92. 89    if (tc.Connected)
  93. 90    {
  94. 91     //如果连接上,证明此商品为开放状态
  95. 92     Console.WriteLine("Port {0} is Open", m_port.ToString().PadRight(6));
  96. 93     Program.openedPorts.Add(m_port);
  97. 94    }
  98. 95   }
  99. 96   catch (System.Net.Sockets.SocketException e)
  100. 97   {
  101. 98    //容错处理
  102. 99    Console.WriteLine("Port {0} is closed", m_port.ToString().PadRight(6));
  103. 100    //Console.WriteLine(e.Message);
  104. 101   }
  105. 102   finally
  106. 103   {
  107. 104    tc.Close();
  108. 105    tc = null;
  109. 106    Program.scannedCount++;
  110. 107    Program.runningThreadCount--;
  111. 108
  112. 109    //Console.WriteLine(Program.scannedCount);
  113. 110  
  114. 111   }
  115. 112  }
  116. 113 }
  117. 114}
  118. 115
  119. 116
  120. 117 
  121.   好了,代码很简单吧!只能扫描TCP端口哦。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值