Android의 Ping (isReachable)소스 분석
try {
InetAddress ia = InetAddress.getByName("192.168.123.254");
if(ia.isReachable(3000)==true) {
tv.setText("Reachable in 3 sec");
tv.append("\naaaa");
} else {
tv.setText("Unreachable in 3 sec");
}
} catch (UnknownHostException e){
tv.setText("UnknownHost Exception");
} catch (IOException e) {
tv.setText("IO Exception : " + e.toString());
} catch (IllegalArgumentException e) {
tv.setText("IllegalArgumentExceptio");
}
(소스 다운로드 방법은 http://source.android.com/download 참고)
dalvik/libcore/luni/src/main/java/java/net/InetAddress.java
public boolean isReachble(int timeout)
┗ public boolean isReachable(NetworkInterface netif, final int ttl, final int timeout)
┗ private boolean
isReachableByTCP(InetAddress dest, InetAddress source,
int timeout)
private boolean isReachableByTCP(InetAddress dest, InetAddress source,
int timeout) throws IOException {
FileDescriptor fd = new FileDescriptor();
// define traffic only for parameter
int traffic = 0;
boolean reached = false;
NETIMPL.createStreamSocket(fd, NetUtil.preferIPv4Stack());
try {
if (null != source) {
NETIMPL.bind(fd, source, 0);
}
NETIMPL.connectStreamWithTimeoutSocket(fd, 7, timeout, traffic,
dest);
reached = true;
} catch (IOException e) {
if (ERRMSG_CONNECTION_REFUSED.equals(e.getMessage())) {
// Connection refused means the IP is reachable
reached = true;
}
}
NETIMPL.socketClose(fd);
return reached;
}
./dalvik/libcore/luni/src/main/java/org/apache/harmony/luni/platform/OSNetworkSystem.java
static native void connectStreamWithTimeoutSocketImpl(FileDescriptor aFD,
int aport, int timeout, int trafficClass, InetAddress inetAddress)
throws IOException;
해당함수는, osNetworkSystem_connectStreamWithTimeoutSocketImpl() 이다.
static void osNetworkSystem_connectStreamWithTimeoutSocketImpl(JNIEnv* env,
jclass clazz, jobject fileDescriptor, jint remotePort, jint timeout,
jint trafficClass, jobject inetAddr)