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

    主站蜘蛛池模板: 亚洲AV无码资源在线观看| 亚洲精品视频在线| 亚洲成av人在线观看网站| 无人在线直播免费观看| 亚洲综合久久久久久中文字幕| 国产啪精品视频网站免费尤物| 狠狠亚洲狠狠欧洲2019| 亚洲国产精品一区二区第一页免| 亚洲色无码国产精品网站可下载| 免费看国产精品3a黄的视频| 亚洲综合欧美色五月俺也去| 看全色黄大色大片免费久久| 亚洲AV电影天堂男人的天堂| 免费va在线观看| h视频在线免费观看| 亚洲国产另类久久久精品黑人 | 亚洲综合欧美色五月俺也去| 免费无码看av的网站| 黄色毛片免费在线观看| 亚洲日韩精品一区二区三区| 久久午夜无码免费| 亚洲国产成人91精品| 中国国语毛片免费观看视频| 久久亚洲精品国产精品黑人| 一级毛片免费观看不卡的| 亚洲国产精品网站久久| 成人免费视频试看120秒| 亚洲1区2区3区精华液| 久久久久久久亚洲精品| 无码国产精品一区二区免费模式| 亚洲男女一区二区三区| 免费特级黄毛片在线成人观看| 免费中文字幕视频| 亚洲情a成黄在线观看动漫尤物| 亚洲精品视频免费看| 亚洲AV色无码乱码在线观看| 日日噜噜噜噜夜夜爽亚洲精品| 久久国产色AV免费观看| 亚洲变态另类一区二区三区 | 两性刺激生活片免费视频| 在线亚洲v日韩v|