【问题标题】:Is there a way to programatically check for used ports without looping?有没有办法在不循环的情况下以编程方式检查使用的端口?
【发布时间】:2021-02-25 13:55:20
【问题描述】:

我熟悉几种检查 Android 上已用端口的方法。

  1. 循环遍历所有可能的端口,尝试在每个端口上创建一个套接字,如果套接字创建失败则使用端口。
  2. 在 shell 中使用 netstat 命令,该命令将列出所有打开的连接,并且可以从那里解析使用的端口。
  3. 在 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 中的语法相同),则该命令的输出为空字符串。

要获得我尝试使用的过程:

  1. Runtime.getRuntime().exec(command);

  2. 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


    【解决方案1】:

    怎么样:

    netstat -ln | awk '/^tcp/ { split($4,arr,":");prts[arr[2]]="" } END { for (i in prts) { print i } }'
    

    获取 netstat 输出,然后使用 awk,专注于所有以 tcp 开头的行。然后将第 4 个分隔字段拆分为一个名为 arr 的数组,该数组基于“:”作为分隔符。将数组的第二个索引(端口号)放在另一个数组prts中作为索引。最后,循环遍历prts数组并打印索引(端口)

    【讨论】:

    • 此解析工作正常,但我认为您没有理解问题所在。问题不在于如何解析netstat 的输出或任何其他将列出使用的端口的类似命令(无论参数是什么)。问题是,从应用程序的 Java 代码调用命令时,调用命令的输出是空字符串,而不是从 adb shell 运行它。我更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2019-06-17
    • 2021-12-28
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多