<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    端口掃描程序

    If you need 200ms for each of the 65536 ports (in the worst case, a firewall is blocking everything, thus making you hit your timeout for every single port), the maths is pretty simple: you need 13k seconds, or about 3 hours and a half.

    You have 2 (non-exclusive) options to make it faster:
    • reduce your timeout
    • paralellize your code
    Since the operation is I/O bound (in contrast to CPU bound -- that is, you spend time waiting for I/O, and not for some huge calculation to complete), you can use many, many threads. Try starting with 20. They would divide the 3 hours and a half among them, so the maximum expected time is about 10 minutes. Just remember that this will put pressure on the other side, ie, the scanned host will see huge network activity with "unreasonable" or "strange" patterns, making the scan extremely easy to detect.

    The easiest way (ie, with minimal changes) is to use the ExecutorService and Future APIs: @import url(http://m.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    public static Future<Boolean> portIsOpen(final ExecutorService es, final String ip, final int port, final int timeout) {
      return es.submit(new Callable<Boolean>() {
          @Override public Boolean call() {
            try {
              Socket socket = new Socket();
              socket.connect(new InetSocketAddress(ip, port), timeout);
              socket.close();
              return true;
            } catch (Exception ex) {
              return false;
            }
          }
       });
    }


    Then, you can do something like:

    public static void main(final String args) {
      final ExecutorService es = Executors.newFixedThreadPool(20);
      final String ip = "127.0.0.1";
      final int timeout = 200;
      final List<Future<Boolean>> futures = new ArrayList<>();
      for (int port = 1; port <= 65535; port++) {
        futures.add(portIsOpen(es, ip, port, timeout));
      }
      es.shutdown();
      int openPorts = 0;
      for (final Future<Boolean> f : futures) {
        if (f.get()) {
          openPorts++;
        }
      }
      System.out.println("There are " + openPorts + " open ports on host " + ip + " (probed with a timeout of " + timeout + "ms)");
    }


    If you need to know which ports are open (and not just how many, as in the above example), you'd need to change the return type of the function to Future<SomethingElse>, where SomethingElse would hold the port and the result of the scan, something like:

    public final class ScanResult {
      private final int port;
      private final boolean isOpen;
      // constructor
      
    // getters
    }


    Then, change Boolean to ScanResult in the first snippet, and return new ScanResult(port, true) or new ScanResult(port, false) instead of just true or false





    posted on 2013-03-14 10:10 paulwong 閱讀(382) 評論(0)  編輯  收藏 所屬分類: 性能優化

    主站蜘蛛池模板: 亚洲国产精品成人精品无码区| 亚洲日本在线看片| 久久久久久AV无码免费网站下载 | 国产日韩精品无码区免费专区国产 | 亚洲熟妇无码爱v在线观看| 破了亲妺妺的处免费视频国产| 国产精品免费久久久久影院| 亚洲色偷偷色噜噜狠狠99网| 亚洲国产日韩在线观频| 亚洲三级在线免费观看| 免费无毒a网站在线观看| 亚洲欧洲精品视频在线观看| 亚洲av麻豆aⅴ无码电影| 99久久人妻精品免费一区| 美女黄色免费网站| 亚洲综合网美国十次| 亚洲AV无码成H人在线观看| 国产人成免费视频网站| 亚洲免费无码在线| 亚洲黄页网在线观看| 国产成人亚洲综合无码精品| 国产老女人精品免费视频 | 亚洲中文字幕伊人久久无码| 日日麻批免费40分钟日本的| 99re6在线精品免费观看| 亚洲日本VA中文字幕久久道具| 国产亚洲综合成人91精品| 日本牲交大片免费观看| 69视频免费观看l| 久久免费观看视频| 在线精品自拍亚洲第一区| 91久久亚洲国产成人精品性色 | 无码色偷偷亚洲国内自拍| 亚洲导航深夜福利| 亚洲综合色自拍一区| 全部免费国产潢色一级| 性做久久久久久久免费看| 无码精品一区二区三区免费视频| 免费国产va视频永久在线观看| 亚洲色大成网站www| 亚洲va久久久久|