2012-06-11 44 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大得多的缓冲区。