2016-11-10 78 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()查詢該進程的文件名。

相關問題