jpcap

2012-06-11 5 views
0

DSP가 패킷 캡처 및 패킷 전송 속도를 PC에 보내는 것보다 PC에 원시 이더넷 패킷을 보내고 이러한 패킷을 캡처하고 응답 응답을 보낼 수 있습니다. 그들은 IP 계층이 없도록 MAC에서 MAC로 메시징합니다. 나는 매 1ms마다 실시간 메시징을 만들고 싶다. DSP는 1 밀리 초마다 메시지를 보내지 만 PC는 메시지를 포착하고 1 밀리 초 미만의 응답을 보낼 수 없습니다. 패킷 포착 및 전송에는 15 - 30ms가 소요됩니다. 이 결과는 나에게 너무 느리다. 어떻게하면 더 빨리 만들 수 있을까요? jpcap 라이브러리 및 운영 체제 Win XP x32를 사용하고 있습니다.jpcap

캡처 코드 :

private void captor() { 
       try { 
        captor = JpcapCaptor.openDevice(cf.getDevice(), 100, true, 1); 
       } catch (Exception ex) { 
        Logger.getLogger(CapturingPacket.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 



    private void capturing() { 
      Packet packet = captor.getPacket(); 
      if (packet != null) { 
       if (packet.data.length > 0) { 
        EthernetPacket ethernetPacket = (EthernetPacket) packet.datalink;     
        String receivedDestMac = Common.byteToMacStringFormat(ethernetPacket.src_mac); 

        if (definedDestMac.equals(receivedDestMac)) { 
         captured(packet.data); 
        } 

       } 
      } 

} 

private class captureRunner implements Runnable { 

     public void run() { 
      captor(); 
      while (running) { 
       capturing(); 
       try { 
        Thread.sleep(0); 
       } catch (InterruptedException err) { 
       } 
      } 
     } 
    } 

보내기 코드 :

private void send(byte[] message) { 
     try { 

      JpcapSender send = JpcapSender.openDevice(cf.getDevice()); 

      Packet packet = new Packet(); 
      //ethernet frame 
      EthernetPacket ethernetPacket = new EthernetPacket(); 

      // #dst_mac 
      ethernetPacket.dst_mac = getDestMac(); 
      // #src_mac 
      ethernetPacket.src_mac = cf.getDevice().mac_address; 
      // #frametype 
      ethernetPacket.frametype = Common.ETHERNET_FRAME_TYPE; 
      // #data 
      packet.data = message; 
      // datalink 
      packet.datalink = ethernetPacket; 
      send.sendPacket(packet); 
      send.close(); 

     } catch (Exception ex) { 
      Common.showErrorMessage("Send Error"); 
      Logger.getLogger(MessagingPacket.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
+1

보낸 패킷마다 장치를 열고 닫아야합니까? –

+0

필요하지 않습니다. 당신 말이 맞습니다. Jim, 고쳐주었습니다. –

답변

0

"캡처 및 전송 패킷이 15 소요 - 30 밀리." - 정상입니다. 이 작업을 훨씬 빠르게 할 수는 없습니다. Windows는 실시간 운영 체제가 아닙니다. 대신 마이크로 컨트롤러를 사용하십시오 (FPGA 및 ARM과 같은 더 나은 옵션이 있지만 이것들에 대한 경험이 없습니다).

+0

JNI가 여기에 사용되는 방식이 WinXP보다 더 중요한 문제라고 생각합니다 ... – fvu

+0

kol ok하지만 wireshark가 얼마나 많은 패킷을 마이크로 초 단위로 캡처 할 수 있습니까? 아이디어가 있습니까? –

+0

캡처 된 패킷 사이의 간격은 쉽게 마이크로 초 정도 될 수 있습니다. 그러나 패킷을 캡쳐하여 * 답장을 보내는 것은 결코 그렇게 빠를 수 없습니다. Windows에는 많은 프로세스와 스레드가 동시에 실행되며 각 스레드는 시간 조각을 얻습니다. 그래서 앱의 정확도는 15-30ms를 넘을 수 없습니다. 당신이 나를 믿지 않는다면, C로 코드를 쉽게 재 구현할 수 있습니다 (타이밍 및 시간 측정을 위해 QueryPerformanceCounter 사용). 결과는 그리 좋지 않을 것입니다. – kol

0

libpcap 필터를 Java 필터 대신 JPcap을 통해 설정할 수 있습니다. 그런 식으로 일치하지 않는 패킷은 JPcap과 Java 코드에 콜백을 일으키지 않습니다.

또한 버퍼보다 ​​큰 버퍼를 사용하십시오.