2012-06-11 40 views
0

DSP將原始以太網數據包發送到PC比捕獲這些數據包併發送ack響應的PC。他們將MAC消息發送給MAC,因此沒有ip層。我想每隔1ms發送一次實時消息。 DSP每1毫秒發送一次消息,但PC不能在1毫秒內捕獲消息併發送應答。捕獲和發送數據包需要15 - 30 ms。這個結果對我來說太慢了。我怎樣才能讓這個更快。我使用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

沒有必要,你是對的吉姆,我修好了。 –

回答

0

「捕獲併發送數據包需要15 - 30毫秒。」 - 這個是正常的。你不能做得更快。 Windows不是實時操作系統。改用微控制器(有更好的選擇,比如FPGA和ARM,但我沒有這些經驗)。

+0

我認爲JNI和它在這裏使用的方式比WinXP更具有問題... – fvu

+0

kol ok但wireshark如何捕獲大量不同的數據包微秒時間級別?你有好主意嗎? –

+0

捕獲的數據包之間的間隔很容易在微秒左右。但是捕獲數據包*和發送回覆永遠不會那麼快。 Windows上有很多進程和大量線程同時運行,並且每個線程都有其時間片。這就是爲什麼你的應用程序的精度不能超過15-30毫秒。如果你不相信我,你可以很容易地用C語言重新實現你的代碼(使用QueryPerformanceCounter進行時間和時間測量) - 結果不會好很多。 – kol

0

使用libpcap篩選器,您可以通過JPcap設置篩選器,而不是使用Java篩選器。這樣,不匹配的數據包甚至不會被捕獲,更不用說引起對JPcap和你的Java代碼的回調。

還使用比100大得多的緩衝區。