`
cgaolei
  • 浏览: 58200 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

用Java实现Ping的功能(续)

阅读更多

之前的文章中,我推荐使用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功能

    在"Java实现ping功能"中,我们可能使用了`Socket`类来模拟TCP的ping操作,通过尝试建立连接来检测目标主机的可达性。此外,由于TCP和ping命令(基于ICMP协议)的机制不同,可能还需要使用`MulticastSocket`或自定义 ...

    java实现的模拟ping功能

    本篇文章将详细解析一个用Java语言编写的模拟Ping功能的实现。通过这个示例,初学者可以更好地理解如何使用Java进行网络编程,尤其是如何模拟发送ICMP(Internet Control Message Protocol)请求的过程。 #### 二、...

    用java实现ping功能

    在Java编程中,我们不能直接使用内置的库来实现ping功能,因为Java标准库并不包含这样的功能。但是,我们可以借助第三方库如jpcap(Java Packet Capture)来实现这个功能。 jpcap是一个Java库,它提供了对网络接口...

    用java实现ping的几种方式

    本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一:纯Java实现ICMP的ping命令 在Java中,可以不依赖于操作系统提供的`ping`命令或任何其他外部工具,通过编程的方式直接发送ICMP包来实现`ping`功能。...

    java中ping命令ping工具类(循环ping)

    java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...

    java实现ping.pdf

    在描述中,“java实现ping.pdf”重申了文档的主题,强调了该程序的功能:用Java语言编写网络诊断工具。同时,通过提及“技术及资料”,揭示了文档可能包含程序源代码、相关技术细节或使用说明。 根据提供的部分源...

    基于Java实现PING的服务器端和客户端设计.zip

    资源包含:课程报告word+源码 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/127039936

    基于socket实现Ping功能的源代码

    在标题中提到的"基于socket的网络编程技术",主要指的是使用Socket API来实现网络通信功能。在本例中,是利用Socket来模拟网络中的"Ping"命令,即检查网络连接的可达性和响应时间。 接着,我们来看"SOCK_RAW"的概念...

    java语言实现ping函数的功能

    在Java编程语言中,实现ping功能通常涉及到网络通信和套接字编程。ping命令在网络中主要用于检查网络连接的可达性,其工作原理是发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,然后接收...

    Java简单实现Ping功能.doc

    Java实现ping功能主要是通过调用操作系统命令,也可以使用高级库如Mina进行自定义网络通信。同时,通过线程池可以并发处理多个ping任务,提高效率。告警机制则可以根据实际情况选择合适的方式实现,确保及时响应系统...

    java 实现的 ping程序

    在Java中实现ping功能,我们需要使用Java的Socket编程接口,但由于Java标准库并不直接支持ICMP协议,我们需要使用更低级别的套接字API,如`java.net.Socket`或`java.net.DatagramSocket`。一般情况下,我们会通过...

    C++实现ping功能

    本主题将深入探讨如何使用C++来实现ping功能,这是一种网络诊断工具,用于检查网络连接的可达性。通常,ping通过发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,并接收响应来测试网络连通性...

    JAVA 实现 ping

    一段JAVA代码 实现ping功能 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel;

    用C语言实现Ping程序功能.rar_Ping功能实现_ping C语言

    本教程将详细探讨如何使用C语言来实现一个基本的Ping程序功能。 首先,我们需要理解Ping的工作原理。Ping通过发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,然后接收相应的回显应答报文来...

    Android中实现ping功能的多种方法详解

    从Java 1.5开始,java.net包中就实现了ICMP ping的功能。使用时应注意,如果远程服务器设置了防火墙或相关的配置,可能会影响到结果。另外,由于发送ICMP请求需要程序对系统有一定的权限,当这个权限无法满足时,is...

    VB 实现PING功能

    在VB(Visual Basic)编程环境中,实现PING功能主要涉及到网络通信和系统进程的交互。PING是一种基于ICMP(Internet Control Message Protocol,互联网控制消息协议)的网络诊断工具,用于测试网络连接性和网络设备...

    C#实现PING的功能

    在C#中实现`PING`功能,可以帮助开发者更好地理解和处理网络连接问题。以下将详细介绍如何使用C#来实现这一功能。 首先,我们需要引入`System.Net.NetworkInformation`命名空间,这个命名空间包含了用于执行`PING`...

    实现ping的功能

    下面我们将详细讨论如何用VC++来实现ping功能。 首先,要实现ping功能,我们需要理解ICMP协议。ICMP是TCP/IP协议族的一部分,主要用于在主机和路由器之间传递控制消息,如网络是否可达、数据包错误报告等。Ping命令...

    VB实现ping功能

    下面将详细介绍如何使用VB实现ping功能,以及涉及的相关知识点。 首先,我们需要创建一个新的VB工程,并在工程中添加一个模块(Module1)。在这个模块中,我们将编写实现ping功能的核心代码。打开Module1.bas文件,...

Global site tag (gtag.js) - Google Analytics