如何使用jpcap加速数据包捕获和数据包发送

时间:2012-06-11 21:51:37

标签: java ethernet jpcap ti-dsp raw-ethernet

DSP将原始以太网数据包发送到PC而不是PC捕获这些数据包并发送确认响应。它们是MAC到MAC的消息传递,所以没有ip层。我希望每1ms进行一次实时消息传递。 DSP每1毫秒发送一次消息,但PC无法捕获消息并在1毫秒内发送回复。捕获和发送数据包需要15 - 30 ms。这个结果对我来说太慢了。我怎样才能更快地做到这一点。我正在使用jpcap库和我的操作系统Win XP x32。

捕获代码:

    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);
        }

    }

2 个答案:

答案 0 :(得分:0)

“捕获和发送数据包需要15 - 30 ms。” - 这个是正常的。你不能更快地做到这一点。 Windows不是实时操作系统。使用微控制器(有更好的选择,如FPGA和ARM,但我没有这些经验)。

答案 1 :(得分:0)

使用libpcap过滤器,您可以通过JPcap设置,而不是使用Java过滤器。这样就不会捕获不匹配的数据包,更不用说引起回调到JPcap,然后是Java代码。

还使用比100更大的缓冲区。