检查运行时的端口使用情况

时间:2016-11-10 14:23:13

标签: java sockets port

在我的应用程序中,在运行时,我希望能够识别是否正在使用某个特定端口(非常容易实现)

public static boolean portAvailable(int port) {
    try (Socket ignored = new Socket("localhost", port)) {
        return false;
    } catch (IOException ignored) {
        return true;
    }
}

但我也想尽可能多地获取有关谁使用此端口的信息。像进程ID,名称等的东西。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

Java不提供您要查找的信息。您将不得不使用特定于操作系统的API。

我不了解* nix系统,但在Windows上,您可以使用GetTcpTable2() / GetTcp6Table2()GetExtendedTcpTable()枚举TCP套接字来获取TCP套接字的拥有进程ID直到找到您感兴趣的IP /端口。对于UDP,有一个GetExtendedUdpTable()功能(还有GetUdpTable()GetUdp6Table()功能,但它们不提供所有者进程ID )。

获得进程ID后,您可以通过以下任一方式获取其文件名:

  1. 使用CreateToolhelp32Snapshot() / Process32First() / Process32Next()枚举正在运行的进程,直到找到匹配的进程ID。

  2. 使用OpenProcess()直接打开给定进程ID的进程,然后使用GetModuleFileNameEx()GetProcessImageFileName()QueryFullProcessImageName()查询该进程的文件名。< / p>