如何使用jnetpcap从ICMP数据包中获取IP地址

时间:2015-05-15 08:36:12

标签: ip-address pcap icmp jnetpcap

我正在使用jnetpcap来分析pcap文件。我知道在遇到IP标头时如何获取地址

if(packet.hasHeader(ip)&&packet.hasHeader(tcp)&&tcp.flags_SYN())
        {       
        sIP = packet.getHeader(ip).source();
        sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);

但是当我有ICMP标头时,我不知道如何获取地址。我试过这个

else if(packet.hasHeader(icmp))
        {
        sIP=packet.getHeader(icmp).source();
        sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);

但显然,它不是有效的。有任何想法吗?提前谢谢

更新:我用过

if(packet.hasHeader(ip, 1)) {
    sIP=ip.source();
    sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);}

但是我收到了一个错误:
 线程" main"中的例外情况Diplotiki.Ex2.main的java.lang.NullPointerException(Ex2.java:83)

第83行包含命令:

 sIP=packet.getHeader(ip,1).source();

我试图点击马克的建议,并添加了

System.out.println(packet.getState().toDebugString());

我意识到程序卡在了第三个数据包上,所以我试图在第四个数据包中得到什么。这就是我得到的:

JMemory: JMemory@4b8838class org.jnetpcap.packet.JPacket$State: size=240 bytes
JMemory: owner=packet.JScanner.class(size=136528/offset=35128)
JPacket.State#004: sizeof(packet_state_t)=120
JPacket.State#004: sizeof(header_t)=40 and *3=120
JPacket.State#004:   pkt_header_map=0x16
JPacket.State#004:        pkt_flags=0x0
JPacket.State#004: pkt_header_count=3
JPacket.State#004:      pkt_wirelen=62
JPacket.State#004   : [  Protocol(ID/Flag) | Start | Prefix | Header | Gap | Payload | Postfix ]
JPacket.State#004[0]: [  ETHERNET( 1/0800) |     0 |      0 |     14 |   0 |      48 |       0 ]
JPacket.State#004[1]: [       IP4( 2/0800) |    14 |      0 |     20 |   0 |      28 |       0 ]
JPacket.State#004[2]: [       TCP( 4/0800) |    34 |      0 |     28 |   0 |       0 |       0 ]

它对你有什么意义吗?

2 个答案:

答案 0 :(得分:0)

您正确的用法是使用packet.hasHeader(ip,1)。这将获得IPv4的第二个实例并将其与数据包绑定。另请注意,您对getHeader的使用是多余的。如果标头存在,hasHeader会自动将标头绑定到数据包。

即。 if(packet.hasHeader(ip, 1)) { sIP=ip.source(); sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP); }

为了帮助实现可视化和调试目的,并确切地查看已解析哪些标头并存储在数据包状态表中,请使用以下代码段转储内容:

System.out.println(packet.getState().toDebugString());

希望这有帮助。

答案 1 :(得分:0)

您仍在使用不存在的getHeader实例1(即第4个数据包)。我再次建议您使用hasHeader。相同的结果但在标头实例不存在时不会抛出空异常。如果您还需要ICMP标头,请将它们组合在一个if()语句中:

if(packet.hasHeader(ip, 1) && packet.hasHeader(icmp)) { sIP = ip.source(); }