2010-12-15 57 views
2

Je souhaite surveiller les périphériques ipv6 à l'aide de la requête ping6. S'il vous plaît laissez-moi savoir s'il existe une bibliothèque open source est disponible pour envoyer et recevoir la requête Ping6. J'ai essayé avec JpCap mais ne pouvais réussir et je reçu le message d'erreur ci-dessousComment envoyer une requête Ping6 à l'aide de la bibliothèque Java (JpCap)

java.io.IOException: seulement IPv4 paquet est pris en charge à jpcap.JpcapSender.nativeSendPacket (natif Méthode) à jpcap.JpcapSender.sendPacket (JpcapSender.java:93) à Ping6.sendPing6Request (Ping6.java:131) à Ping6.main (Ping6.java:40)

S'il vous plaît aidez-moi comment résoudre ce problème . Y at-il un moyen que je peux envoyer Ping6 en utilisant JpCap,

Vos pensées sont très appréciées.

-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; 
    } 
    } 
    } */ 
    } 
} 

} 

Ma mise en œuvre est donnée ci-dessous,

Répondre

0

Je ne sais pas JpCap, mais pour moi, il semble que vous créez un IPv4 IPPacket et un ICMPPacket IPv6 . Vous utilisez setIPv4Parameter() sur l'IPPacket et spécifiez l'adresse de destination en utilisant une adresse IPv4. Je doute qu'il soit possible d'envoyer un paquet ICMPPacket IPv6 comme ça.

1

En fait, je suis nouveau sur jpcap mais peut-être que votre interface réseau ne supporte pas ipv6 ou que vous avez désactivé la fonctionnalité ipv6 de votre interface réseau? dans les fenêtres sept ne suit pour activer (si disponible) ipv6 pour l'interface réseau:

  1. faites un clic droit sur le réseau con dans la barre des tâches (coin inférieur droit de l'écran)
  2. cliquez sur réseau ouvert et centre de partage
  3. cliquez sur modifier les paramètres de l'adaptateur (coin supérieur gauche)
  4. clic droit sur l'interface réseau (c.-à-local Area Connection) et cliquez sur propriétés
  5. Vérifiez Internet Protocol Version 6 (TCP/IP v6)
  6. cliquez dans décrochage
  7. Puis Appliquer et OK.

Espérons que cela aide.