2010-12-15 10 views
2

Ich möchte die IPv6-Geräte mit Ping6-Anfrage überwachen. Bitte lassen Sie mich wissen, ob eine Open-Source-Bibliothek verfügbar ist, um Ping6-Anfragen zu senden und zu empfangen. Ich habe versucht, mit JpCap konnte aber nicht gelingen, und ich bekam die folgende FehlermeldungSo senden Sie Ping6-Anfrage mit Java-Bibliothek (JpCap)

java.io.IOException: nur IPv4-Paket unterstützt wird bei jpcap.JpcapSender.nativeSendPacket (Mutter Methode) bei jpcap.JpcapSender.sendPacket (JpcapSender.java:93) bei Ping6.sendPing6Request (Ping6.java:131) bei Ping6.main (Ping6.java:40)

Bitte helfen Sie mir, wie dieses Problem zu lösen . Gibt es eine Möglichkeit, Ping6 mit JpCap,

senden können Ihre Gedanken werden sehr geschätzt.

-R.Ravikumar

/** 
* $Id:$ 
* 
* This class is used to send the ping6 request to the agent. 
* 
* To get these details we are using JpCap open sourec tool. 
* 
*/ 

import jpcap.*; 
import jpcap.packet.*; 

import java.net.*; 
import java.util.*; 


/** 
* Ping6.java 
* @author R.Ravikumar 
* @version 1.0 (Dec 13, 2010). 
* 
*/ 

public class Ping6 implements PacketReceiver 
{ 

private static Ping6 ping6 = null; 

byte[] gatewayMac = null; 
JpcapCaptor captor = null; 
InetAddress intfNIC = null; 
Map<String,byte[]> ipVsMac = null; 
     jpcap.NetworkInterface nic = null; 

public static void main(String args[]) 
{ 
    Ping6 p6 = Ping6.getInstance(); 
    p6.sendPing6Request(); 
} 

public synchronized static Ping6 getInstance() 
{ 
    if(ping6 == null) 
    { 
    ping6 = new Ping6(); 
    } 
    return ping6; 
} 

private Ping6() 
{ 
    //Default Constructor. 
    initialize(); 
} 

private void initialize() 
{ 
    DefaultGatewayDetails gateway = new DefaultGatewayDetails(); 
    gatewayMac = gateway.getgatewayMacAddress(); 
    ipVsMac = gateway.getIpVsMacDetails(); 
    startCapture(); 
} 

public boolean startCapture() 
{ 
    try 
    { 
    jpcap.NetworkInterface[] nicList =JpcapCaptor.getDeviceList(); 

    networkLoop : 
    for(jpcap.NetworkInterface machineNIC : nicList) 
    { 
    for(NetworkInterfaceAddress intfAddr : machineNIC.addresses) 
    { 
    intfNIC = intfAddr.address; 
    if(intfNIC instanceof Inet6Address) 
    { 
     nic = machineNIC; 
     break networkLoop; 
    } 
    } 
    } 
    if(nic == null) 
    { 
    System.err.println("Unable to find the local network interface."); 
    return false; 
    } 

    captor=JpcapCaptor.openDevice(nic,2000,false,0); 
    /* PacketReceiver receiver = new PacketReceiver(); 
      receiver.captor = captor; 
    receiver.start(); */ 
    } 
    catch(Exception ex) 
    { 
    ex.printStackTrace(); 
    return false; 
    } 
    return true; 
} 

public void sendPing6Request() 
{ 
    try 
    { 
    //create icmp version6 packet. 
    ICMPPacket icmp=new ICMPPacket(); 
    icmp.type = ICMPPacket.IPPROTO_IPv6; 
    icmp.seq=100; 
    icmp.id=0; 
    icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
    icmp.data="data".getBytes(); 

    EthernetPacket ether=new EthernetPacket(); 
    ether.frametype=EthernetPacket.ETHERTYPE_IP; 
    ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
    ether.dst_mac=gatewayMac; 
    icmp.datalink=ether; 

    //create top layer IPv4 packet 
    IPPacket ipPacket = new IPPacket(); 
    ipPacket.setIPv4Parameter(0,false,false,false,0,false,false,false, 
    0,2697,128,IPPacket.IPPROTO_IPv6, 
    InetAddress.getByName("rravikumar"),InetAddress.getByName("192.168.118.2")); 
    ipPacket.datalink = ether; 
    icmp.ippacket = ipPacket; 

        or 
        /* 
         //create icmp version6 packet. 
    ICMPPacket icmp=new ICMPPacket(); 
    icmp.type = ICMPPacket.IPPROTO_IPv6; 
    icmp.seq=100; 
    icmp.id=0; 
    icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
    icmp.data="data".getBytes(); 

    EthernetPacket ether=new EthernetPacket(); 
    ether.frametype=EthernetPacket.ETHERTYPE_IP; 
    ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
    ether.dst_mac=gatewayMac; 
    icmp.datalink=ether; 
         */ 


    JpcapSender sender=JpcapSender.openDevice(nic); 
    sender.sendPacket(icmp); 
    } 
    catch(Exception exp) 
    { 
    exp.printStackTrace(); 
    } 
} 

public void receivePacket(Packet packet) 
{ 
    if(packet instanceof ICMPPacket) 
    { 
    /* ICMPPacket icmpPacket = (ICMPPacket) packet; 
    if((externalIp.equals(icmpPacket.src_ip) && intfIpList.contains(icmpPacket.dst_ip)) || 
    (externalIp.equals(icmpPacket.dst_ip) && intfIpList.contains(icmpPacket.src_ip))) 
    { 
    DatalinkPacket datalink = icmpPacket.datalink; 
    if(datalink instanceof EthernetPacket) 
    { 
    if(externalIp.equals(icmpPacket.src_ip)) 
    { 
      gatewayMac = ((EthernetPacket) datalink).src_mac; 
    } 
    else 
    { 
     gatewayMac = ((EthernetPacket) datalink).dst_mac; 
    } 
    } 
    } */ 
    } 
} 

} 

Meine Implementierung unten gegeben wird,

Antwort

0

Ich weiß nicht, JpCap, aber für mich sieht es aus wie Sie einen IPv4-IPPacket und einen IPv6-ICMPPacket erstellen . Sie verwenden setIPv4Parameter() für das IP-Paket und geben die Zieladresse mithilfe einer IPv4-Adresse an. Ich bezweifle, dass es möglich ist, so ein IPv6-ICMP-Paket zu senden.

1

Eigentlich bin ich neu in jpcap, aber vielleicht unterstützt Ihre Netzwerkschnittstelle nicht ipv6 oder Sie hatten die IPv6-Funktion Ihrer Netzwerkschnittstelle deaktiviert? in Fenstern sieben gehen Sie wie folgen (falls vorhanden) ipv6 für Netzwerk-Schnittstelle zu aktivieren:

  1. Rechtsklick in der Taskleiste über Netzwerksteue (rechte untere Ecke des Bildschirms)
  2. Klick offenes Netzwerk und Freigabecenter
  3. klicken Wechseladapter Einstellung (linke obere Ecke)
  4. rechts, um die Netzwerk-Schnittstelle klicken (dh LAN-Verbindung) und klicken Sie auf Eigenschaften
  5. prüfen Internet Protocol Version 6 (TCP/IP v6)
  6. Zum Vergrößern klicken Stall
  7. Dann Apply und OK.

Ich hoffe, es hilft.