2017-08-08 49 views
0

我從這裏有這個代碼 https://javatutorial.net/capture-network-packages-java 但它不會返回src或目標ips。我可以看到通過JNetPcap捕獲包沒有IP返回

  System.out.println("packet.getHeader(ip)"); 
      System.out.println(packet.getHeader(ip)); 

IP中的IP:******* IP4 - 「IP版本4」 - 偏移量= 14(0xE)長度= 20協議套件= NETWORK

葉:

葉:版本= 4

葉:爲hLen = 5 [5 * 4 = 20個字節,沒有IP選項]

葉:區分服務爲0x0 =(0)

Ip:0000 00 .. = [0]代碼點:未設置

Ip:.... ..0。 = [0] ECN位:未設置

葉:.... ... 0 = [0] ECE位:未設置

葉:長度= 137

葉:ID = 0xC22C (49708)

葉:標誌= 0×2(2)

葉:0 .. = [0]保留

葉:0.1。 = [1] DF:不片段:設置

葉:..0 = [0] MF:多個片段:未設置

葉:偏移量= 0

葉:TTL = 62 [生存時間]

葉:式= 6下一個[:傳輸控制]

葉:校驗= 0xF22E(61998)[正確]

葉:源= 10.222.82.222

葉:目的地= 10.222.82.224

葉:

我在做什麼錯?

`import java.util.ArrayList; 
import java.util.List; 
import org.jnetpcap.Pcap; 
import org.jnetpcap.PcapIf; 
import org.jnetpcap.packet.PcapPacket; 
import org.jnetpcap.packet.PcapPacketHandler; 
import org.jnetpcap.protocol.network.Ip4; 
public class PackageCapture { 
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 
    int r = Pcap.findAllDevs(alldevs, errbuf); 
    if (r != Pcap.OK || alldevs.isEmpty()) { 
     System.err.printf("Can't read list of devices, error is %s", 
       errbuf.toString()); 
     return; 
    } 
    System.out.println("Network devices found:"); 
    int i = 0; 
    for (PcapIf device : alldevs) { 
     String description = (device.getDescription() != null) ? device 
       .getDescription() : "No description available"; 
     System.out.printf("#%d: %s [%s]\n", i++, device.getName(), 
       description); 
    } 
    PcapIf device = alldevs.get(0); // Get first device in list 
    System.out.printf("\nChoosing '%s' on your behalf:\n", 
      (device.getDescription() != null) ? device.getDescription() 
        : device.getName()); 
    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: " 
       + errbuf.toString()); 
     return; 
    } 
    PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() { 
     public void nextPacket(PcapPacket packet, String user) { 
      byte[] data = packet.getByteArray(0, packet.size()); // the package data 
      byte[] sIP = new byte[4]; 
      byte[] dIP = new byte[4]; 
      Ip4 ip = new Ip4(); 
      if (packet.hasHeader(ip) == false) { 
       return; // Not IP packet 
      } 
      ip.source(sIP); 
      ip.destination(dIP); 
      /* Use jNetPcap format utilities */ 
      String sourceIP = 
    org.jnetpcap.packet.format.FormatUtils.ip(sIP); 
       String destinationIP = 
    org.jnetpcap.packet.format.FormatUtils.ip(dIP); 

      System.out.println("srcIP=" + sourceIP + 
        " dstIP=" + destinationIP + 
        " caplen=" + packet.getCaptureHeader().caplen()); 
     } 
    }; 
    // capture first 10 packages 
    pcap.loop(10, jpacketHandler, "jNetPcap"); 
    pcap.close(); 
} 
}` 

回答

1

真的很簡單,他們改變了代碼。而不是

ip.source(sIP); ip.destination(dIP);

執行

sIP = ip.source(); dIP = ip.destination();