0

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

ip route get 192.168.1.54

它会回答类似:

192.168.1.12 dev wlan0  table local_network  src 192.168.1.1

我有兴趣在哪里获得src: 192.168.1.1

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

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

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

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

4

2 回答 2

1

使用 Android 的DatagramSocket应该直接为你提供源地址:

val socket = DatagramSocket()
val targetAddress = InetAddress.getByName(destHostOrIp)
socket.connect(targetAddress, port)
val local = socket.getLocalAddress()
于 2021-11-29T20:33:53.667 回答
1

看起来您想要 WiFi 网络的网络网关地址。

此功能基于doc和一些示例

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;
}
于 2021-11-29T21:40:35.803 回答