2016-11-10 31 views
1

在我的应用程序,在运行时,我希望能够确定是否正在使用特定端口(很容易做到这一点)在运行时检查端口使用情况?

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

,但我也想获得尽可能多的信息尽可能关于谁在使用此端口。东西像进程ID,名称等。我该如何去做这件事?

+0

'windows'或'* nix'平台? – Saravana

+0

理想情况下我可以同时支持,但* nix是最低要求 – stikku

回答

1

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

我不知道* nix系统,但在Windows中可以通过使用GetTcpTable2()/GetTcp6Table2()GetExtendedTcpTable()枚举TCP套接字,直到找到IP获取TCP套接字拥有的进程ID /端口您有兴趣。对于UDP,有一个GetExtendedUdpTable()函数(并且也有GetUdpTable()GetUdp6Table()函数,但它们不提供所有者进程ID)。

一旦你有一个进程ID,您可以通过获得它的文件名:

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

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

相关问题