1

これは私がこれまでに得たコードです...

import java.net.*;

public class PortScanner {

    public static void main(String args[]) {
        int startPortRange = 0;
        int stopPortRange = 0;

        startPortRange = Integer.parseInt(args[0]);
        stopPortRange = Integer.parseInt(args[1]);

        for (int i = startPortRange; i <= stopPortRange; i++) {
            try {
                Socket ServerSok = new Socket("127.0.0.1", i);

                System.out.println("Port in use: " + i);

                ServerSok.close();
            } catch (Exception e) {

            System.out.println("Port not in use: " + i);
        }
    }
}

たとえば、smtp サーバーではシステムがポート 25 を使用しており、smtp サーバーに接続されているリモート クライアントのポートをスキャンする必要があります。どうやってやるの?

私を助けてください。

4

3 に答える 3

2

コードは次のようになります。

    for (int i = startPortRange; i <= stopPortRange; i++) {
            try {
                    Socket serverSok = new Socket("127.0.0.1", i);

                    System.out.println("Port in use: " + i);

                    serverSok.close();
            } catch (Exception e) {
                    System.out.println("Port not in use: " + i);
            }
    }
于 2009-12-01T15:20:05.537 に答える
1

あなたの問題を理解した場合:

  • プロセス S はマシン A で実行され、ポート P で着信接続をリッスンします。
  • プロセス C はマシン B で実行され、ポート T から A の P に接続します。
  • プログラム F はマシン A で実行されます
  • F は S ではありません

Java を使用して T in F を発見しますか? それはいけません!

開いているソケットのオペレーティング システム テーブルを読み取る必要があります。これはオペレーティング システムに依存する操作であり、Java ではサポートされていません。

それ以外の場合、F が S の場合は、S のコードを変更して T を検出できます。S が java.net.ServerSocket クラスを使用する場合は、ServerSocket.accept() を検索し、返された Socket インスタンスで getPort() を使用して T を検出できます。

LLP アンドレア

于 2009-12-02T16:18:42.077 に答える
0

まず、ポートは使用可能であるがリッスンできないため、この方法にはいくつかの方法論的な問題があります。

実際にリスニングポートを探していて、上記のアプローチを使用したい場合は、少なくともいくつかのスレッドを生成して、各ポートが順番にタイムアウトするのを待つ必要がないようにします。

最善の方法は、完全なTCPハンドシェイクを実行するのではなく、synスキャンのようなものを模倣することですが、Javaの金属にそれを近づけることができるかどうかはわかりません。

でもいい質問です。

于 2009-12-01T15:18:55.747 に答える