【发布时间】:2021-02-25 13:55:20
【问题描述】:
我熟悉几种检查 Android 上已用端口的方法。
- 循环遍历所有可能的端口,尝试在每个端口上创建一个套接字,如果套接字创建失败则使用端口。
- 在 shell 中使用
netstat命令,该命令将列出所有打开的连接,并且可以从那里解析使用的端口。 - 在 shell 中使用
cat /proc/net/tcp命令,类似于netstat命令。
第一个选项的问题是循环遍历所有可能的端口会花费太多时间,如果我想确保获得所有打开的端口,它的效率不够。
第二个和第三个选项的问题是(在非 root 设备上)虽然 shell 命令可以在 shell(adb shell)中执行并且输出清晰可见,但在 Android 应用程序中尝试从 Java 代码执行命令时,命令输出cat /proc/net/tcp 是空字符串,netstat 命令仅输出标头。我猜问题是应用程序权限不足以运行以上命令。
是否有任何其他方法可以检查使用的端口,或者我使用选项 2 或 3 中的命令做错了什么?
编辑:
澄清一下,在使用任何应列出来自adb shell 的连接信息的命令时,这将正常工作。但是,如果我尝试从应用程序的 Java 代码中调用任何命令(与 adb shell 中的语法相同),则该命令的输出为空字符串。
要获得我尝试使用的过程:
-
Runtime.getRuntime().exec(command); -
new ProcessBuilder().command("sh", "-c", command).start();
例如netstat 命令的输出(带任何参数)如下:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path
【问题讨论】:
标签: android shell process connection port