import java.net.InetAddress;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.EthernetPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.IPPacket;
public class JPing {
private NetworkInterface[] devices = JpcapCaptor.getDeviceList();
private JpcapSender sender;
private JpcapCaptor jpcap;
private ICMPPacket icmpPacket;
private List<String> listResult = new ArrayList<String>();
/**
* 组织ICMP报文发送,并开启线程接收报文
* @param ip
*/
public void ping(String ip) {
try {
jpcap = JpcapCaptor.openDevice(devices[0], 200, false, 20);
sender = jpcap.getJpcapSenderInstance();
jpcap.setFilter("icmp", true);// 过滤器,只接受ICMP报文
icmpPacket = new ICMPPacket();
icmpPacket.type = ICMPPacket.ICMP_ECHO; // 发送回显请求报文
icmpPacket.setIPv4Parameter(0, false, false, false, 0, false,
false, false, 0, 1010101, 100, IPPacket.IPPROTO_ICMP,
devices[0].addresses[1].address, InetAddress.getByName(ip));
// 随意的32bytes数据
icmpPacket.data = "abcdefghijklmnopqrstuvwxyzabcdef".getBytes();
EthernetPacket ethernetPacket = new EthernetPacket();
ethernetPacket.frametype = EthernetPacket.ETHERTYPE_IP;
ethernetPacket.src_mac = devices[0].mac_address;
// 广播地址
ethernetPacket.dst_mac = new byte[] { (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
icmpPacket.datalink = ethernetPacket;
listResult.add("Pinging " + icmpPacket.dst_ip + " with "
+ icmpPacket.data.length + " bytes of data: ");
startCapThread(jpcap);
for (int i = 0; i < 5; i++) {
icmpPacket.sec = 0;
//icmpPacket.usec = System.currentTimeMillis();
icmpPacket.usec = new GregorianCalendar().getTimeInMillis();// 记录发送时间
icmpPacket.seq = (short) (1000 + i);
icmpPacket.id = (short) (999 + i);
sender.sendPacket(icmpPacket);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 接收ICMP报文
* @param jpcap
*/
public void getIcmpPacket(JpcapCaptor jpcapCaptor) {
try {
while (true) {
long tmp = 0;
String tmpStr = null;
ICMPPacket rp;
rp = (ICMPPacket) jpcapCaptor.getPacket();
if ((rp != null) && (rp.seq - rp.id == 1)
&& (rp.type == ICMPPacket.ICMP_ECHOREPLY)) {// 若是ICMP回应报文,则列出。。。
tmp = (rp.sec * 1000 + rp.usec / 1000 - icmpPacket.sec
* 1000 - icmpPacket.usec); // 计算发送与接受的时间差
if (tmp <= 0)
tmpStr = " < 1 ms ";
else
tmpStr = "= " + tmp + " ms ";
System.out.println("Reply from "
+ rp.src_ip.getHostAddress() + ": bytes = "
+ rp.data.length + " time " + tmpStr + "TTL = "
+ rp.hop_limit);
listResult.add("Reply from " + rp.src_ip.getHostAddress()
+ ": bytes = " + rp.data.length + " time " + tmpStr
+ "TTL = " + rp.hop_limit);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 接收ICMP报文
* @param jpcap
*/
public void startCapThread(final JpcapCaptor jpcap) {
Runnable runner = new Runnable() {
public void run() {
getIcmpPacket(jpcap);
}
};
new Thread(runner).start();
}
public static void main(String[] args) {
new JPing().ping("www.baidu.com");
}
}
分享到:
相关推荐
### 使用Java实现Ping的多种方法 在日常网络管理和软件开发中,经常需要检查网络连通性。`ping`命令作为一种简单而有效的工具被广泛应用于这一领域。本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一...
以下是一个简单的示例代码,展示了如何使用jpcap实现ping功能: ```java import jpcap.*; import jpcap.packet.*; public class SendICMP { public static void main(String[] args) throws Exception { // 获取...
在计算机网络课程设计中,需要实现 ARP 报文的发送和接收,并将其展示在可视化界面上。为此,我们将程序分为两个板块:界面设计和 ARP 报文的发送和接收的实现。 二、界面设计 在界面设计中,我们使用 Java 的 ...
在Java编程语言中,实现ping功能通常涉及到网络通信和套接字编程。ping命令在网络中主要用于检查网络连接的可达性,其...在实际应用中,可能需要借助第三方库,如Jpcap或libpcap的Java接口,来实现更为准确的ping功能。
Java 实现 ICMP 的 ping 命令是一种在 Java 环境下模拟操作系统原生 `ping` 工具的方法。通常,`ping` 命令是通过发送 Internet 控制消息协议 (ICMP) 的回显请求报文来检查网络连接的可达性和延迟。在 Java 中,由于...
因此,我们通常需要使用Jpcap或libpcap库(Java绑定)来捕获和发送ICMP报文。 2. **Jpcap库**:Jpcap是一个Java库,用于网络数据包捕获和分析。它提供了接口来创建原始网络报文,包括ICMP报文,然后通过网络接口...
标题 "java_icmp_ping" 涉及到的是一个使用Java编程语言开发的项目,它实现了基于ICMP(Internet Control Message Protocol,互联网控制消息协议)的“ping”功能,类似于我们在Windows系统中使用的命令行工具“ping...
总结,实现Linux环境下Java的`ping`和`traceroute`功能涉及到对网络协议的深入理解,以及可能需要使用第三方库。在C#中,`ping`操作相对简单,而`traceroute`则需要更多工作。两者都需要开发者具备扎实的网络基础和...
通过Jpcap,开发者可以实现各种网络应用,如网络监控、性能测试、安全分析或协议开发。例如,你可以创建一个简单的网络嗅探器来查看网络流量,或者构建一个自定义的故障诊断工具。Jpcap的API设计直观,提供了一系列...
总结来说,Java语言实现抓包主要利用Jpcap库,通过编程的方式捕获和解析网络数据包,获取网络通信的各种细节。这个项目不仅涵盖了基本的数据包捕获,还扩展到了流量和速度的监测,提供了一套全面的网络监控解决方案...
JPCAP的API文档,JPCAP使得Java可以进行数据链路层操作,比如编写ping程序,自定义协议等,跨平台
开发者可能需要使用第三方库如JPCAP或者通过`Socket`模拟`Ping`操作。 5. **异常处理**:在网络操作中,异常处理至关重要。`ParallelPing`需要妥善处理如`IOException`、`UnknownHostException`等可能出现的异常。 ...
使用Jpcap发送ARP以及ICMP请求 一、实验过程 首先获取本地的网卡以及IP信息 输入当前网关的地址,在这个拓扑图中也就是172.17.5.1 程序封装ARP请求,向网关发送ARP请求 抓取ARP相应的包,过滤之后获得网关的MAC地址 ...
由于Java标准库不直接支持发送ICMP包,JavaPinger通常需要借助第三方库如JPCAP或JNA来实现。 **2. 套接字编程** 在Java中,套接字(Socket)是进行网络通信的基础。JavaPinger可能使用了Socket类或者DatagramSocket...
- **环境依赖**:需要Java环境支持,确保Java版本符合FPB的要求。 - **配置说明**:配置文件通常包含在FPB安装目录下,用于设置项目的路径、编译选项等。 #### 3. 系统构成 - **核心组件**:主要包括协议定义模块、...
jNetPort是一个完整的基于Java的网络监视工具,包括:-用于多个端口扫描器引擎(包括Nmap)的图形用户界面-具有全球IP位置显示的Traceroute工具-图形ping工具-统计部分,该部分可以管理,比较和显示结果-多任务环境...
功能验证手段:在运行 Sniffer 的同时,执行标准的 Ping 、 Telnet 和浏览网页等操作,检查 Sniffier 能否返回预期的结果。 数据包保存:可以保存选中的包,保存文件要有可读性。 文件重组:一个文件在传输过程中,...