2016-11-10 2 views
1

In meiner Anwendung, während der Laufzeit, würde ich gerne die Lage sein, zu erkennen, ob ein bestimmt Port (ziemlich einfach, dies zu tun)Überprüfen Sie die Portnutzung zur Laufzeit?

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

aber ich würde auch so viele Informationen wie möglich verwendet wird, um bekommen darüber, wer diesen Port benutzt. Sachen wie Prozess-ID, Name usw. Wie gehe ich dabei vor?

+0

'Windows' oder' * nix' Plattform? – Saravana

+0

Idealerweise kann ich beides unterstützen, aber * nix ist die Mindestanforderung – stikku

Antwort

1

Java bietet nicht die Informationen, nach denen Sie suchen. Sie müssen stattdessen Betriebssystemspezifische APIs verwenden.

Ich weiß nicht, über * nix-Systemen, aber unter Windows können Sie die besitzende Prozess-ID für eine TCP-Socket erhalten, indem GetTcpTable2()/GetTcp6Table2() oder GetExtendedTcpTable() mit TCP-Sockets aufzuzählen, bis Sie die IP finden/Port sind Sie interessiert Für UDP gibt es eine GetExtendedUdpTable()-Funktion (und es gibt auch GetUdpTable() und GetUdp6Table() Funktionen, aber sie bieten keine Besitzer Prozess-IDs).

Sobald Sie eine Prozess-ID haben, können Sie den Dateinamen entweder erhalten:

  1. CreateToolhelp32Snapshot()/Process32First()/Process32Next() mit laufenden Prozesse aufzuzählen, bis Sie eine passende Prozess-ID finden.

  2. OpenProcess() mit direkt dem Prozess eines bestimmten Prozess-ID zu öffnen und abfragen, um dann den Dateinamen des Prozesses GetModuleFileNameEx() verwenden, GetProcessImageFileName() oder QueryFullProcessImageName().

Verwandte Themen