Java jNetPcap-分析来自PCAP文件的ARP数据包

Java jNetPcap-分析来自PCAP文件的ARP数据包,java,network-protocols,pcap,arp,jnetpcap,Java,Network Protocols,Pcap,Arp,Jnetpcap,我正在尝试使用jNetPcap Java库获取PCAP文件中ARP数据包的信息。我真正想要的是读取以太网帧中的源地址和目标地址,以及ARP数据包中的发送方MAC和目标MAC 到目前为止,我已经能够加载一个PCAP文件,遍历包捕获中的所有包,并显示那些确实属于ARP协议的包的包号(帧号) 我如何获得我想要的其他信息 以下是我目前的代码: package firstjavapcaptest; import org.jnetpcap.Pcap; import org.jnetpcap.packet.

我正在尝试使用jNetPcap Java库获取PCAP文件中ARP数据包的信息。我真正想要的是读取以太网帧中的源地址和目标地址,以及ARP数据包中的发送方MAC和目标MAC

到目前为止,我已经能够加载一个PCAP文件,遍历包捕获中的所有包,并显示那些确实属于ARP协议的包的包号(帧号)

我如何获得我想要的其他信息

以下是我目前的代码:

package firstjavapcaptest;

import org.jnetpcap.Pcap;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
import org.jnetpcap.protocol.lan.Ethernet;
import org.jnetpcap.protocol.network.Arp;
import org.jnetpcap.protocol.tcpip.Tcp;

public class FirstJavaPcapTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        final StringBuilder errbuf = new StringBuilder(); // for any error messages
        final String file = "Z:\\test_pcap.pcap";
        Tcp tcp = new Tcp(); // Preallocate a TCP header
        Arp arp = new Arp(); // Preallocate a ARP header
        System.out.printf("Opening file for reading: %s%n", file);  

        Pcap pcap = Pcap.openOffline(file, errbuf);  
        if (pcap == null) {  
            System.err.printf("Error while opening device for capture: " + errbuf.toString());  
            return;  
        }  

        PcapPacketHandler<String> jphArp = new PcapPacketHandler<String>() { 
            public void nextPacket(PcapPacket packet, String user) {
                Ethernet ethh  = new Ethernet();
                if (packet.hasHeader(arp)) {
                    System.out.println("[" + packet.getFrameNumber() + "]");
                }
            }
        };

        try {  
            pcap.loop(-1, jphArp, "");
        } finally {  
            pcap.close();  
        }
    }

}
packagefirstjavapcaptest;
导入org.jnetpcap.Pcap;
导入org.jnetpcap.packet.PcapPacket;
导入org.jnetpcap.packet.PcapPacketHandler;
导入org.jnetpcap.protocol.lan.Ethernet;
导入org.jnetpcap.protocol.network.Arp;
导入org.jnetpcap.protocol.tcpip.Tcp;
公共类FirstJavaPcapTest{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
final StringBuilder errbuf=new StringBuilder();//查找任何错误消息
最终字符串文件=“Z:\\test\u pcap.pcap”;
Tcp=新Tcp();//预先分配Tcp头
Arp Arp=new Arp();//预先分配Arp头
System.out.printf(“打开文件进行读取:%s%n”,文件);
Pcap Pcap=Pcap.openOffline(文件,errbuf);
如果(pcap==null){
System.err.printf(“打开捕获设备时出错:+errbuf.toString());
返回;
}  
PcapPacketHandler jphArp=新的PcapPacketHandler(){
public void nextPacket(PcapPacket数据包,字符串用户){
Ethernet ethh=新以太网();
if(数据包哈希头(arp)){
System.out.println(“[”+packet.getFrameNumber()+“]”);
}
}
};
试试{
pcap.loop(-1,jphArp,“”);
}最后{
pcap.close();
}
}
}

您使用的是哪个版本的jnetpcap?我猜是1.3。 以下是关于ARP协议中偏移量的维基百科文章:

。。。
8发送方硬件地址(SHA)(前2个字节)
10(下2个字节)
12(最后2个字节)
14发送方协议地址(SPA)(前2个字节)
16(最后2个字节)
18目标硬件地址(THA)(前2个字节)
20(下2个字节)
22(最后2个字节)
24目标协议地址(TPA)(前2个字节)
26(最后2个字节)

以下是jnetpcap javadocs中的Arp类函数:

byte[]  sha()            Sha.
int     shaLength()      Sha length.
byte[]  spa()            Spa.
int     spaLength()      Spa length.
int     spaOffset()      Spa offset.
byte[]  tha()            Tha.
int     thaLength()      Tha length.
int     thaOffset()      Tha offset.
byte[]  tpa()            Tpa.
int     tpaLength()      Tpa length.
int     tpaOffset()      Tpa offset.`