之前的文章中,我推荐使用InetAddress类中的isReachable()方法来实现ping的功能。不久后,就有网上的朋友对我
的观点做出了指点。其指出的是isReachable方法在Windows系统平台上的实现(native
c)并没有使用ICMP,而是全完使用连接echo端口7 的方法。
在OpenJDK 6 Windows平台上Native c的实现中有几段注释:
C代码
him.sin_port = htons(7);
connect_rv = connect(fd, (structsockaddr *)&him, len);
可以看到,在windows下isReachable方法的确是只使用了连接端口7的方法。这一点在API文档上并没有指出
。所以我对其理解存在偏差也就在此(没有去看具体的实现代码,也感谢指出我问题的朋友)。
网上还有另一种方法是使用官方关于NIO包的例子中的ping方法:
源代码URL:http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/Ping.java
我看了一下这个官方的NIO
ping的例子,并对其进行了调试和数据捕获。实际,这个官方的例子使用的方法并不是通过ICMP实现的,而是通过连接daytime端口13
:
Java代码