之前的文章中,我推荐使用InetAddress类中的isReachable()方法来实现ping的功能。不久后,就有网上的朋友对我的观点做出了指点。其指出的是isReachable方法在Windows系统平台上的实现(native c)并没有使用ICMP,而是全完使用连接echo端口7
的方法。
在OpenJDK 6 Windows平台上Native c的实现中有几段注释:
/*
* Windows implementation of ICMP & RAW sockets is too unreliable for now.
* Therefore it's best not to try it at all and rely only on TCP
* We may revisit and enable this code in the future.
*/
/* Can't create a raw socket, so let's try a TCP socket */
him.sin_port = htons(7); /* Echo */
connect_rv = connect(fd, (struct sockaddr *)&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
:
// The default daytime port
static int DAYTIME_PORT = 13;
// The port we'll actually use
static int port = DAYTIME_PORT;
try {
address = new InetSocketAddress(InetAddress.getByName(host),port);
} catch (IOException x) {
failure = x;
}
我也在Linux下使用InetAddress.isReachable()方法做了试验:当登录为普通用户时,使用的是连接echo端口7,登录为root用户时,使用的是ICMP请求。通过对一台网络上的路由进行连接,两个测试结果都反回了true.
InetAddress.isReachable()通过试图连接TCP端口的方法是利用了TCP/IP协议的三次握手原理,即使对方机器在端口上没有服务,当接收到请求时会立刻拒绝,如果对方机器不在网络上则结果是超时!这个方法的实现正是利用了这一点。
引用OpenJDK 6,isReachable()方法native c实现的一段注释:
/**
* connection established or refused immediately, either way it means
* we were able to reach the host!
*/
总结:在使用java 5以上版本开发时,无论哪种系统平台,使用InetAddress.isReachable()方法都是最佳的。
分享到:
相关推荐
此项目是spring boot+thymeleaf+maven的Java实现ping命令的功能以及端口检测是否开放的功能
很好的一个java实现的ping功能,适合初学者学习使用,相互学习,相互交流啊
用java实现ping的几种方式:纯Java实现ICMP的ping命令,JAVA调用外部EXE实现PING功能,ICMP Ping in Java(JDK 1.5 and above),最简单的办法,直接调用CMD
java调用jpcap实现ping功能代码
资源包含:课程报告word+源码 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/127039936
java实现ping.pdf
java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...
用C语言实现Ping程序功能
Java简单实现Ping功能
一段JAVA代码 实现ping功能 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel;
C++实现ping命令的功能(Windows),使用WinSock2.h借助Windows API实现ping命令已经域名解析功能。
通过几个java包中的API实现了ping这样的功能,完整代码 请参考!
用vc++网络编程技术实现ping功能的一个小程序
基于socket的网络编程技术,用到SOCK_RAW的原始套接字类型。里面对简单ICMP协议和IP协议有着很完整的诠释和定义。可以交流zhaquanmin@163.com
C#实现PING的功能 让 你 成为WINDOWS编程高手,慢慢的积累~
C语言实现Ping功能 PDF 包含源代码和简介PDF 包含源代码和简介PDF 包含源代码和简介
用Jpcap和Java实现图形化的Ping程序.pdf
C语言实现ping功能
php类方法实现ping功能,区别于使用php系统调用exec()方法,对返回信息的处理更加方便和自定义