【问题标题】:Android: get route info programmaticallyAndroid:以编程方式获取路线信息
【发布时间】:2021-12-12 21:11:17
【问题描述】:

我正在向远程发送 UDP 数据包,我想知道将用于此的本地接口的 IP。在 shell 中我会运行:

ip route get 192.168.1.54

它会回答类似:

192.168.1.12 dev wlan0  table local_network  src 192.168.1.1

我有兴趣获得src192.168.1.1

我可以像这样调用exec 来做到这一点:

Runtime.getRuntime().exec("ip route get 192.168.1.54")

但这似乎不是很优雅,我不知道哪些设备支持它(它适用于其中一些设备,而其他设备返回错误代码“1”,尽管该命令适用于 adb shell)。

有没有办法用 Android SDK 做到这一点?我查看了ConnectivityManager,但找不到方法...

【问题讨论】:

  • 你是对的!它碰巧在我的特定测试中起作用,但这并不是我所要求的。

标签: android routetable


【解决方案1】:

您似乎需要 WiFi 网络的网络网关地址。

这个函数基于doc和一些examples

public InetAddress getGateway(Context context) {
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        // getActiveNetwork() requires M or later.
        return null;
    }
    Network activeNetwork = connectivityManager.getActiveNetwork();
    if (activeNetwork == null) {
        return null;
    }
    List<RouteInfo> routes = connectivityManager.getLinkProperties(activeNetwork).getRoutes();
    for (RouteInfo route : routes) {
        if (route.isDefaultRoute() && !(route.getGateway() instanceof Inet6Address)) {
           return route.getGateway();
        }
    }
    return null;
}

【讨论】:

    【解决方案2】:

    使用Android的DatagramSocket应该直接给你源地址:

    val socket = DatagramSocket()
    val targetAddress = InetAddress.getByName(destHostOrIp)
    socket.connect(targetAddress, port)
    val local = socket.getLocalAddress()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多