0

大規模なプロジェクトに関連して、最終的にパケット テストを実行できるように、開いているポートをスキャンするコードを実装しようとしています。現時点では、google.com に接続しようとしていますが、ポート 80 が接続を受け入れることがわかっているので、このポートを含むさまざまなポートをスキャンするようにコードをフォーマットしました。ただし、ポート 80 に直接接続することはできますが、スキャナー コードはそれを通過しているようです。私は誰かが何か考えを持っているのだろうかと思っていましたか?

public class PortScanner {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        String host = "www.google.com";

        System.out.println("Attempting to connect to " + host + " at port 80...");
        try {
            socket.connect(new InetSocketAddress(host, 80), 5000);
            System.out.println("Connection Successful.");
        }
        catch (Exception e) {
            //Just bypass the exceptions for now
        }

        System.out.println("Scanning for open ports on " + host);


        for (int i = 75; i < 85; i++) {
            System.out.println("Attempting to connect to " + host + " on port " + i);
            try {
                socket.connect(new InetSocketAddress(host, i), 5000);
                System.out.println("Open port found at " + i);
            }
            catch (ConnectException e) {
                System.err.println("Connect Exception Thrown on Port " + i);
                continue;
            }
            catch (SocketException e) {
                System.err.println("Socket Exception Thrown on Port " + i);
                continue;
            }
            catch (UnknownHostException e) {
                System.err.println("Unknown host at " + host);
                System.exit(1);
            }
        }

        System.out.println("Closing connection to " + host);
        socket.close();
        System.out.println("Connection closed");
    }
}

実際、ループは、ポート 80 でスローされた SocketException があることを報告します。

Attempting to connect to www.google.com at port 80...
Connection Successful.
Scanning for open ports on www.google.com
Socket Exception Thrown on Port 75
Socket Exception Thrown on Port 76
Socket Exception Thrown on Port 77
Socket Exception Thrown on Port 78
Socket Exception Thrown on Port 79
Socket Exception Thrown on Port 80
Socket Exception Thrown on Port 81
Socket Exception Thrown on Port 82
Socket Exception Thrown on Port 83
Attempting to connect to www.google.com on port 75
Socket Exception Thrown on Port 84
Attempting to connect to www.google.com on port 76
Attempting to connect to www.google.com on port 77
Attempting to connect to www.google.com on port 78
Attempting to connect to www.google.com on port 79
Attempting to connect to www.google.com on port 80
Attempting to connect to www.google.com on port 81
Attempting to connect to www.google.com on port 82
Attempting to connect to www.google.com on port 83
Attempting to connect to www.google.com on port 84
Closing connection to www.google.com
Connection closed

コンソール ログが順番どおりに出力されているという事実から、接続の試行が速すぎて、プログラムが使用可能なポートを見逃してしまったのではないかと思いましたが、どうすればよいかわかりません。それについてやってください。

どんな考えでも大歓迎です!

4

1 に答える 1

1

ASocketは最大 1 つのアクティブな接続にのみ使用できます。また、ポート スキャンの開始時に接続する (そして終了時にのみ閉じる) ため、(connect()メソッドを呼び出して) 接続をさらに試みると、SocketException.

のメッセージを印刷しSocketExceptionて確認します。これは次のようになります"already connected"

提案:Socket各試行の前に新しいを作成します。複数の/新しい接続にa を再利用Socketできないことに注意してください。の Javadoc からの引用:Socket.close()

ソケットが閉じられると、それ以上ネットワークを使用することはできません (つまり、再接続または再バインドすることはできません)。新しいソケットを作成する必要があります。

于 2015-02-10T12:08:49.327 に答える