2013-05-31 3 views
0

Я написал фрагмент кода для ppp ping с использованием JPCAP. код, который я написал, приводится ниже:Capture ping packs исключает исключение (слишком много экземпляров)

while (true) { 
    try { 
    PacketCapture m_pcap; 
    m_pcap = new PacketCapture(); 
    m_pcap.open("\\Device\\NPF_{007262BD-....-7EE83D72EBEA}",true);//param 1 is actual device ID 
    m_pcap.setFilter("proto ICMP", true); 
    pktlistener a = new pktlistener(); //handles the packet 
    m_pcap.addPacketListener(a); 
    System.out.println("going to sleep"); 
    Thread.sleep(1 * 1000);// Waiting for 1 second before ending capture 
    System.out.println("woken up"); 
    m_pcap.removePacketListener(a); 
    m_pcap.endCapture(); 
    m_pcap.close(); 
    a = null; 
    m_pcap = null; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Теперь выше код начинается новый захват после каждой секунды. Проблема с вышеизложенным заключается в том, что после 10 прогонов цикла это исключает исключение:

Exception in thread "Thread-6" java.lang.Error: Too many instances, exceeds 10 
    at net.sourceforge.jpcap.capture.PacketCapture.<init>(PacketCapture.java:51) 

Q1. Как я могу это предотвратить. Мне нужно каждую секунду запускать новый пакет PacketCapture.

Q2. Есть ли еще один более простой способ захвата сообщений ping, полученных в системе через java?

+0

Пройдите по этой ссылке. Это может помочь вам. [1]: http://stackoverflow.com/questions/4452814/how-to-send-ping6-request-using-java-library-jpcap?rq=1 –

ответ

0

Вы не можете использовать конструктор PacketCapture более десяти раз. Такое поведение жёстко как конструктор выглядит следующим образом:

/** 
* Create a new packet capture instance. 
*/ 
public PacketCapture() { 
    if (nextInstance >= INSTANCE_MAX) { 
     throw new Error("Too many instances, exceeds " + INSTANCE_MAX); 
    } 

    instanceNum = nextInstance++; 
} 

Для захвата запросов звона, вы должны попробовать следующий код

public class Main { 

    public static void main(String[] args) throws CaptureDeviceLookupException { 
     Capture cap = new Capture(); 
     cap.doCapture(); 
    } 
} 

class PingListener implements PacketListener { 

    @Override 
    public void packetArrived(Packet packet) { 
     try { 
      // only ICMP packages 
      if (packet instanceof ICMPPacket) { 
       ICMPPacket tcpPacket = (ICMPPacket) packet; 
       int data = tcpPacket.getMessageCode(); 
       // only echo request packages 
       if (data == ICMPMessages.ECHO) { 
        // print source and destination. 
        String srcHost = tcpPacket.getSourceAddress(); 
        String dstHost = tcpPacket.getDestinationAddress(); 
        System.out.println("Ping from: " + srcHost + " to " + dstHost); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

class Capture { 
    public void doCapture() { 
     // create capture instance 
     PacketCapture capture = new PacketCapture(); 
     // add listener that handles incomming and outgoing packages 
     PingListener pingListener = new PingListener(); 
     capture.addPacketListener(pingListener); 
     // m_pcap.setFilter("filter here or in handler", true); 

     try { 
      capture.open("\\Device\\NPF_{...}", true); // connect capture to device 
      while (true) { 
       capture.capture(1); // capture one package 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); // exception during capture or handling of 
           // packages 
     } finally { 
      // technically never reached as the loop goes on forever. 
      // if loop terminates after a while then: 

      // remove listener 
      capture.removePacketListener(pingListener); 
      // end capture (only necessary, if PacketCapture still waits for 
      // other packages) 
      capture.endCapture(); 
      // close connection to capture device 
      capture.close(); 
     } 
    } 
} 

Я думаю, что это недоразумение класса PacketCapture. Он фактически не захватывает один пакет и затем отбрасывается. Он открывает соединение с устройством, которое вы хотите захватить, и затем начинает прослушивание до тех пор, пока вы удерживаете это соединение. Затем вы начинаете захватывать пакеты n по телефону capture.capture(n). Для каждого пакета, приходящего, когда «захват» блокирует вашу программу, вызывается слушатель.

В качестве альтернативы вы можете отказаться от цикла while и использовать capture.capture(-1). Это заблокирует вашу программу навсегда, пока вы не закроете захват с другого устройства.

+0

Я фактически отправляю HTTP-запросы на сервер. Когда сервер получает запрос, он может или не может выполнить ping мой компьютер. Поэтому мне нужно отслеживать, какой запрос вызвал пинг. Для реализации этого я создал фактический PktListener (моего кода) с конструктором, имеющим HTTP-запрос в качестве параметра. И в методе packetArrived, если приходит пинг, я печатаю HTTP-запрос (от переменной, принадлежащий этому классу), в файл, определяя, какие запросы генерируют пинг. Поэтому мне нужно начинать новый экземпляр каждую секунду. – Rishabh

+0

@ Rishabh отредактировал ответ, чтобы соответствовать вашей проблеме. Я думаю, что есть недоразумение в отношении того, что делает PacketCapture. – DKM

+0

Код работает нормально. Это определенно решит мою проблему. Благодаря! – Rishabh

Смежные вопросы