如何扫描使用中的远程主机端口?

时间:2009-12-01 15:12:41

标签: java sockets ports

这是我到目前为止的代码......

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服务器的远程客户端上的端口。我怎么能这样做?

请帮帮我。

3 个答案:

答案 0 :(得分: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);
            }
    }

答案 1 :(得分:1)

如果我理解你的问题:

  • 进程S在机器A上运行并在端口P上侦听传入连接
  • 进程C在机器B上运行并从端口T连接到A上的P
  • 你的程序F在机器A上运行
  • F不是S

你想用Java发现T中的T吗?你不能!

您必须阅读开放式插座的操作系统表。这是一个依赖于操作系统的操作,java不支持它。

否则,如果F为S,则可以更改S的代码以发现T.如果S使用java.net.ServerSocket类,则可以在返回的Socket实例上搜索ServerSocket.accept()并使用getPort()发现T

LLP,Andrea

答案 2 :(得分:0)

首先,这种方法存在一些方法问题,因为端口可以使用,但不能监听。

如果您实际上只是在寻找侦听端口,并且想要使用上述方法,至少会产生一些线程,这样您就不必等待每个端口按顺序超时。

最好的方法是模仿syn扫描,而不是进行完整的TCP握手,但我不确定你是否可以在Java中接近金属。

虽然问题很好。