Android 如何通过SDK编程获取指定目标IP对应的本地路由源IP地址
解决方案
实现思路
无需执行shell命令,利用UDP套接字的特性即可直接拿到对应源IP:
- UDP属于无连接协议,对指定目标地址执行
connect操作时,系统内核只会完成路由表匹配、确定出口网络接口和源IP的逻辑,不会实际发送任何数据包 - 此时读取套接字的本地地址,和
ip route get返回的src字段值完全一致
示例代码
import java.net.DatagramSocket import java.net.InetAddress /** * 获取发往指定目标IP时使用的本地出口IP * @param targetIp 目标远端IP * @return 本地出口IP,获取失败返回null */ fun getOutboundSourceIp(targetIp: String): String? { var socket: DatagramSocket? = null return try { val targetAddr = InetAddress.getByName(targetIp) socket = DatagramSocket() // UDP connect仅触发内核路由计算,端口可任意填写 socket.connect(targetAddr, 10000) socket.localAddress.hostAddress } catch (e: Exception) { e.printStackTrace() null } finally { socket?.close() } }
注意事项
- 该方法仅需要普通的
INTERNET权限,只要你的应用本身需要发送UDP包就已经配置了该权限,无需额外申请 - 不能在主线程调用该方法,需要放到子线程或协程中执行,避免触发主线程网络操作异常
- 兼容性覆盖所有Android 4.0及以上版本,不受厂商定制ROM的命令权限限制,比执行shell命令稳定性高很多
内容的提问来源于stack exchange,提问作者JonasVautherin
相关产品推荐
相关产品推荐

