<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://www.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 閱讀(381) 評(píng)論(0)  編輯  收藏 所屬分類: 性能優(yōu)化

    主站蜘蛛池模板: 国产大陆亚洲精品国产| 亚洲国产av玩弄放荡人妇| 亚洲国产精品一区二区久| 国产亚洲精aa在线看| 欧洲亚洲国产精华液| 中文字幕在线免费视频| 中文字幕免费在线| 日韩毛片无码永久免费看| 亚洲最大av无码网址| 久久久久亚洲AV片无码下载蜜桃| 亚洲av永久无码嘿嘿嘿| 精品一区二区三区无码免费直播| 国产成年无码久久久免费| 免费下载成人电影| 亚洲AV无码之日韩精品| 亚洲最大福利视频网站| 男人的天堂av亚洲一区2区| 三级网站在线免费观看| 9久9久女女免费精品视频在线观看 | 亚洲爆乳无码精品AAA片蜜桃| 一级看片免费视频| 亚洲一级毛片免费观看| 国产无遮挡又黄又爽免费视频| 亚洲精品乱码久久久久久中文字幕| 亚洲六月丁香六月婷婷蜜芽 | 亚洲精品中文字幕无码AV| 亚洲AV色无码乱码在线观看| a毛片免费观看完整| 成人免费无码大片A毛片抽搐 | a在线视频免费观看在线视频三区| 99re6在线视频精品免费下载| 日本免费v片一二三区| 久久国产精品亚洲综合| 久久久久亚洲国产AV麻豆| 久久综合给合久久国产免费 | 国产美女a做受大片免费| 亚洲va中文字幕无码久久不卡| 亚洲精品宾馆在线精品酒店| 免费人成黄页在线观看日本| 狼友av永久网站免费观看| 水蜜桃亚洲一二三四在线 |