之前的文章中,我推荐使用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()方法都是最佳的。
分享到:
相关推荐
在"Java实现ping功能"中,我们可能使用了`Socket`类来模拟TCP的ping操作,通过尝试建立连接来检测目标主机的可达性。此外,由于TCP和ping命令(基于ICMP协议)的机制不同,可能还需要使用`MulticastSocket`或自定义 ...
本篇文章将详细解析一个用Java语言编写的模拟Ping功能的实现。通过这个示例,初学者可以更好地理解如何使用Java进行网络编程,尤其是如何模拟发送ICMP(Internet Control Message Protocol)请求的过程。 #### 二、...
在Java编程中,我们不能直接使用内置的库来实现ping功能,因为Java标准库并不包含这样的功能。但是,我们可以借助第三方库如jpcap(Java Packet Capture)来实现这个功能。 jpcap是一个Java库,它提供了对网络接口...
本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一:纯Java实现ICMP的ping命令 在Java中,可以不依赖于操作系统提供的`ping`命令或任何其他外部工具,通过编程的方式直接发送ICMP包来实现`ping`功能。...
java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...
在描述中,“java实现ping.pdf”重申了文档的主题,强调了该程序的功能:用Java语言编写网络诊断工具。同时,通过提及“技术及资料”,揭示了文档可能包含程序源代码、相关技术细节或使用说明。 根据提供的部分源...
资源包含:课程报告word+源码 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/127039936
在标题中提到的"基于socket的网络编程技术",主要指的是使用Socket API来实现网络通信功能。在本例中,是利用Socket来模拟网络中的"Ping"命令,即检查网络连接的可达性和响应时间。 接着,我们来看"SOCK_RAW"的概念...
在Java编程语言中,实现ping功能通常涉及到网络通信和套接字编程。ping命令在网络中主要用于检查网络连接的可达性,其工作原理是发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,然后接收...
Java实现ping功能主要是通过调用操作系统命令,也可以使用高级库如Mina进行自定义网络通信。同时,通过线程池可以并发处理多个ping任务,提高效率。告警机制则可以根据实际情况选择合适的方式实现,确保及时响应系统...
在Java中实现ping功能,我们需要使用Java的Socket编程接口,但由于Java标准库并不直接支持ICMP协议,我们需要使用更低级别的套接字API,如`java.net.Socket`或`java.net.DatagramSocket`。一般情况下,我们会通过...
本主题将深入探讨如何使用C++来实现ping功能,这是一种网络诊断工具,用于检查网络连接的可达性。通常,ping通过发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,并接收响应来测试网络连通性...
一段JAVA代码 实现ping功能 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel;
本教程将详细探讨如何使用C语言来实现一个基本的Ping程序功能。 首先,我们需要理解Ping的工作原理。Ping通过发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,然后接收相应的回显应答报文来...
从Java 1.5开始,java.net包中就实现了ICMP ping的功能。使用时应注意,如果远程服务器设置了防火墙或相关的配置,可能会影响到结果。另外,由于发送ICMP请求需要程序对系统有一定的权限,当这个权限无法满足时,is...
在VB(Visual Basic)编程环境中,实现PING功能主要涉及到网络通信和系统进程的交互。PING是一种基于ICMP(Internet Control Message Protocol,互联网控制消息协议)的网络诊断工具,用于测试网络连接性和网络设备...
在C#中实现`PING`功能,可以帮助开发者更好地理解和处理网络连接问题。以下将详细介绍如何使用C#来实现这一功能。 首先,我们需要引入`System.Net.NetworkInformation`命名空间,这个命名空间包含了用于执行`PING`...
下面我们将详细讨论如何用VC++来实现ping功能。 首先,要实现ping功能,我们需要理解ICMP协议。ICMP是TCP/IP协议族的一部分,主要用于在主机和路由器之间传递控制消息,如网络是否可达、数据包错误报告等。Ping命令...
下面将详细介绍如何使用VB实现ping功能,以及涉及的相关知识点。 首先,我们需要创建一个新的VB工程,并在工程中添加一个模块(Module1)。在这个模块中,我们将编写实现ping功能的核心代码。打开Module1.bas文件,...