在网络上看到了这个项目,本人对这个不太了解,但挺兴趣所以也推荐给大家,希望能一起学习。
jNetPcap是
libpcap的一个Java完整封装。jNetPcap使
用与libpcap相同风格的API。libpcap是unix/linux平台下的网络数据包捕获函数库,大多数网络监控软件都以它为基础。
Libpcap可以在绝大多数类unix平台下工作。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。
jNetPcap 官方网站:
http://jnetpcap.com/
下面是官方上的一些演示示例:
ClassicPcapExample.java
1 /**
2 * Copyright (C) 2008 Sly Technologies, Inc. This library is free software; you
3 * can redistribute it and/or modify it under the terms of the GNU Lesser
4 * General Public License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version. This
6 * library is distributed in the hope that it will be useful, but WITHOUT ANY
7 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
8 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
9 * details. You should have received a copy of the GNU Lesser General Public
10 * License along with this library; if not, write to the Free Software
11 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
12 */
13 package org.jnetpcap.examples;
14
15 import java.nio.ByteBuffer;
16 import java.util.ArrayList;
17 import java.util.Date;
18 import java.util.List;
19
20 import org.jnetpcap.Pcap;
21 import org.jnetpcap.PcapHandler;
22 import org.jnetpcap.PcapIf;
23
24 /**
25 * This example is the classic libpcap example shown in nearly every tutorial on
26 * libpcap. It gets a list of network devices, presents a simple ASCII based
27 * menu and waits for user to select one of those interfaces. We will just
28 * select the first interface in the list instead of taking input to shorten the
29 * example. Then it opens that interface for live capture. Using a packet
30 * handler it goes into a loop to catch a few packets, say 10. Prints some
31 * simple info about the packets, and then closes the pcap handle and exits.
32 *
33 * @author Mark Bednarczyk
34 * @author Sly Technologies, Inc.
35 */
36 @SuppressWarnings("deprecation")
37 public class ClassicPcapExample {
38
39 public static void main(String[] args) {
40 List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICs
41 StringBuilder errbuf = new StringBuilder(); // For any error msgs
42
43 /********************************************
44 * 取得设备列表
45 ********************************************/
46 int r = Pcap.findAllDevs(alldevs, errbuf);
47 if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
48 System.err.printf("Can't read list of devices, error is %s", errbuf
49 .toString());
50 return;
51 }
52
53 System.out.println("Network devices found:");
54
55 int i = 0;
56 for (PcapIf device : alldevs) {
57 System.out.printf("#%d: %s [%s]\n", i++, device.getName(), device
58 .getDescription());
59 }
60
61 PcapIf device = alldevs.get(2); // We know we have atleast 1 device
62 System.out.printf("\nChoosing '%s' on your behalf:\n", device
63 .getDescription());
64
65 /***************************************
66 * 打开选中的设备
67 ***************************************/
68 int snaplen = 64 * 1024; // Capture all packets, no trucation
69 int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
70 int timeout = 10 * 1000; // 10 seconds in millis
71 Pcap pcap = Pcap
72 .openLive(device.getName(), snaplen, flags, timeout, errbuf);
73
74 if (pcap == null) {
75 System.err.printf("Error while opening device for capture: "
76 + errbuf.toString());
77 return;
78 }
79
80 /**********************************************************************
81 * Third we create a packet hander which will be dispatched to from the
82 * libpcap loop.
83 **********************************************************************/
84 PcapHandler<String> printSummaryHandler = new PcapHandler<String>() {
85
86 public void nextPacket(String user, long seconds, int useconds,
87 int caplen, int len, ByteBuffer buffer) {
88 Date timestamp = new Date(seconds * 1000 + useconds/1000); // In millis
89
90 System.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",
91 timestamp.toString(), // timestamp to 1 ms accuracy
92 caplen, // Length actually captured
93 len, // Original length of the packet
94 user // User supplied object
95 );
96 }
97 };
98
99 /************************************************************
100 * Fourth we enter the loop and tell it to capture 10 packets
101 ************************************************************/
102 pcap.loop(10, printSummaryHandler, "jNetPcap rocks!");
103
104 /*
105 * Last thing to do is close the pcap handle
106 */
107 pcap.close();
108 }
109 }
110
PcapDumperExample.java
package org.jnetpcap.examples;
import java.io.File;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import org.jnetpcap.Pcap;
import org.jnetpcap.PcapDumper;
import org.jnetpcap.PcapHandler;
import org.jnetpcap.PcapIf;
public class PcapDumperExample {
public static void main(String[] args) {
List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICs
StringBuilder errbuf = new StringBuilder(); // For any error msgs
/***************************************************************************
* First get a list of devices on this system
**************************************************************************/
int r = Pcap.findAllDevs(alldevs, errbuf);
if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
System.err.printf("Can't read list of devices, error is %s\n",
errbuf.toString());
return;
}
PcapIf device = alldevs.get(1); // We know we have atleast 1 device
/***************************************************************************
* Second we open up the selected device
**************************************************************************/
int snaplen = 64 * 1024; // Capture all packets, no trucation
int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
int timeout = 10 * 1000; // 10 seconds in millis
Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);
if (pcap == null) {
System.err.printf("Error while opening device for capture: %s\n",
errbuf.toString());
return;
}
/***************************************************************************
* Third we create a PcapDumper and associate it with the pcap capture
***************************************************************************/
String ofile = "tmp-capture-file.cap";
PcapDumper dumper = pcap.dumpOpen(ofile); // output file
/***************************************************************************
* Fouth we create a packet handler which receives packets and tells the
* dumper to write those packets to its output file
**************************************************************************/
PcapHandler<PcapDumper> dumpHandler = new PcapHandler<PcapDumper>() {
public void nextPacket(PcapDumper dumper, long seconds, int useconds,
int caplen, int len, ByteBuffer buffer) {
dumper.dump(seconds, useconds, caplen, len, buffer);
}
};
/***************************************************************************
* Fifth we enter the loop and tell it to capture 10 packets. We pass
* in the dumper created in step 3
**************************************************************************/
pcap.loop(10, dumpHandler, dumper);
File file = new File(ofile);
System.out.printf("%s file has %d bytes in it!\n", ofile, file.length());
/***************************************************************************
* Last thing to do is close the dumper and pcap handles
**************************************************************************/
dumper.close(); // Won't be able to delete without explicit close
pcap.close();
if (file.exists()) {
file.delete(); // Cleanup
}
}
}
注:运行demo时,需要注意的情况:
jNetPcap
类库是都通JNI,调用系统的动态链接库来实现与底层设备的交互。所以运行时需要加载。解决办法如下:
设置
-Djava.library.path参数
java -Djava.library.path=c:\jnetpcap\lib -jar
myJNetPcapApp.jar
Good Luck!
Yours Matthew!
posted on 2008-11-27 22:55
x.matthew 阅读(11763)
评论(1) 编辑 收藏 所属分类:
最新开源动态