这前的文章我推荐使用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的例子,并对其进行了调试和数据捕获。实际,这个官方的例子使用的方
用Java实现Ping的功能(续)
最新推荐文章于 2023-02-23 14:02:15 发布
本文探讨了Java中实现Ping功能的不同方法,包括InetAddress.isReachable()在Windows上实际通过连接端口7而非ICMP,以及官方NIO示例中使用的daytime端口13。同时,介绍了该方法在不同操作系统和权限下的行为差异,以及其利用TCP/IP协议三次握手进行主机可达性判断的原理。
摘要由CSDN通过智能技术生成