ICMP 本文判断设备网络连接是否正常,是通过ICMP协议实现的,ICMP (Internet Control Message Protpl) ,ICMP 是TCP/IP协议簇的一个子协议,用于在 IP主机、路由器 之间传递控制信息。 控制信息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息并不传输用户数据,但是对于用户数据的传递骑着重要作用。
ICMP的报文格式如下图
Java/Android 平台代码实现
public static boolean reachableByPing(String addr,int reachTimeout) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName(addr);
return reachableByPing(inetAddress,reachTimeout,false);
}
public static boolean reachableByPing(InetAddress addr, int reachTimeout,boolean isWindows) {
try {
if (addr.isReachable(reachTimeout))
return true;
String cmd = String.format("ping -%s 1 %s", isWindows?"n" : "c", addr.getHostAddress());
Process myProc = Runtime.getRuntime().exec(cmd);
myProc.waitFor();
return myProc.exitValue() == 0;
}
catch (IOException ignore) {
return false;
}
catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
return false;
}
}
● 首先通过InetAddress 类提供的的 isReachable函数来判断 网络是否可达 ● 如果InetAddress.isReachable返回false,则再使用 ping 程序进行判断
|