我有一个小应用程序,我在其中检查应用程序是否正在运行,如果它正在运行我得到进程的PID然后尝试获取它打开的TCP连接的IP地址,但即使有多个不同的程序我始终得到0.0.0.0:port
而不是实际的IP地址,在Windows上打开资源监视器会显示正确的IP。在CMD中手动运行netstat也只能给我0.0.0.0:port
。
有没有办法获得资源监视器中显示的正确IP?
命令:"netstat -an -p tcp -o"
这是我在java中得到它的方式:
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(appConstants.NETSTAT_COMMAND);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine = "";
serverIPAddress = "";
while ((inputLine = in.readLine()) != null) {
if (inputLine.contains(appPIDNumber)) {
serverIPAddress = inputLine.substring(31, 54);
System.out.println("IP before edit: " + serverIPAddress);
if (serverIPAddress.equalsIgnoreCase("0.0.0.0:0")
|| serverIPAddress.contains("0.0.0.0:0")
|| serverIPAddress.equalsIgnoreCase("0.0.0.0")
|| serverIPAddress.contains("0.0.0.0")
|| serverIPAddress.equalsIgnoreCase("127.0.0.0")
|| serverIPAddress.contains("127.0.0.0")
|| serverIPAddress.equalsIgnoreCase("127.0.0.1")
|| serverIPAddress.contains("127.0.0.1")
|| serverIPAddress.equalsIgnoreCase("")) {
serverIPAddress = null;
System.out.println("IP ADDRESS FAIL");
break;
}
if (serverIPAddress.contains(":")) {
serverIPAddress = serverIPAddress.substring(0, serverIPAddress.lastIndexOf(":")).trim();
System.out.println("CORRECT IP ADDRESS: " + serverIPAddress);
}
}
}
} catch (IOException e) {
LoggingUtils.LogExceptions(LoggingConstants.ERROR, e.toString());
}
return serverIPAddress;
}
答案 0 :(得分:0)
netstat只会显示已建立连接的外部IP地址,但不会显示仍然只在本地侦听的连接。但听起来你知道这一点,并且正在寻找已建立的联系。
我的猜测是你的问题可能是由inputLine.contains(appPIDNumber)
造成的。可能是appPIDNumber出现在较早的行中吗?也许作为端口号码?您应该具体检查PID列中的条目是否与您的PID匹配,而不仅仅是该行的任何部分。即使这不会立即导致您的错误,但如果PID与列表开头的某个侦听端口匹配,则代码中的错误仍会导致其随机失败。
也许尝试if (inputLine.trim().endsWith(" "+appPIDNumber)) {
,看看是否有帮助。
答案 1 :(得分:0)
它打开的TCP连接的IP地址
如果你指的是它侦听的TCP IP:端口,除非程序绑定到特定的IP地址和端口,否则它将是0.0.0.0:xxx,这不是通常。但是如果进程位于本地主机中,则您不需要它,例如,您可以使用127.0.0.1。如果它是服务器而您只是想知道它是否正在运行,那么只需尝试连接它即可。你并不需要这一切。
如果您指的是已连接的远程TCP IP:端口,您将查看错误的行或右侧的错误列。
如果您再说一些其他内容,请澄清。