Как отправить запрос Ping6 с использованием библиотеки Java (JpCap) - PullRequest
2 голосов
/ 15 декабря 2010

Я бы хотел отслеживать устройства ipv6 с помощью запроса ping6. Пожалуйста, дайте мне знать, есть ли какая-либо библиотека с открытым исходным кодом для отправки и получения запроса Ping6. Я попытался с JpCap, но не смог, и я получил следующее сообщение об ошибке

java.io.IOException: только пакет IPv4 поддерживается в jpcap.JpcapSender.nativeSendPacket (Native Метод) в jpcap.JpcapSender.sendPacket (JpcapSender.java:93) на Ping6.sendPing6Request (Ping6.java:131) в Ping6.main (Ping6.java:40)

Пожалуйста, помогите мне, как решить эту проблему. Есть ли способ отправить Ping6 с помощью JpCap,

Ваши мысли высоко ценятся.

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

}

Моя реализация приведена ниже,

Ответы [ 2 ]

1 голос
/ 09 января 2012

На самом деле я новичок в jpcap, но, возможно, ваш сетевой интерфейс не поддерживает ipv6, или вы отключили функцию ipv6 вашего сетевого интерфейса? В Windows 7 сделайте следующее, чтобы включить (если доступно) ipv6 для сетевого интерфейса:

  1. щелкните правой кнопкой мыши сеть con на панели задач (в правом нижнем углу экрана)
  2. нажмите открыть сеть и центр обмена
  3. нажмите изменить настройки адаптера (левый верхний угол)
  4. щелкните правой кнопкой мыши сетевой интерфейс (т. Е. Подключение по локальной сети) и выберите свойства
  5. Чек Internet Protocol Version 6 (TCP/IP v6)
  6. Нажмите Установить
  7. Затем примените и OK.

Надеюсь, это поможет.

0 голосов
/ 05 января 2011

Я не знаю JpCap, но для меня похоже, что вы создаете IPv4 IPPacket и IPv6 ICMPPacket.Вы используете setIPv4Parameter () на IPPacket и указываете адрес назначения с помощью адреса IPv4.Я сомневаюсь, что можно отправить ICMP-пакет IPv6 подобным образом.

...