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 在 F 中发现 T 吗?你不能!

您必须阅读打开套接字的操作系统表。这是依赖于操作系统的操作,java 不支持。

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

律师事务所,安德里亚

于 2009-12-02T16:18:42.077 回答
0

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

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

最好的方法是模仿同步扫描之类的东西,而不是进行完整的 TCP 握手,但我不确定你能否在 Java 中接近金属。

很好的问题。

于 2009-12-01T15:18:55.747 回答