2014-02-25 15 views
1

我想問你一個具體的問題:我想發展與jNetPcap 1.4庫中的軟件交換機上的Java 1.7,我們的目標是有一個程序,它可以轉發在端口號上收到的數據包。 1到港口號碼2,反之亦然(就在這兩個NIC-s上)。jNetPcap了sendpacket()函數複製幀

我可以看到兩個接口的所有傳入的數據包,但是當涉及到轉發,我有一個問題:如果我在接口X發送具有pcap.sendPacket(PcapPacket)PcapPacketHandler()類裏面的nextPacket()功能會看到它也,而且會被視爲一個「新」數據包,只是忽略它,因爲它是由同一個Pcap實例發送的。

有什麼辦法可以忽略由pcap.sendPacket(PcapPacket)函數發送的數據包(所以它們不會再次出現在nextPacket()函數中)?

我對底層winpcap庫瞭解不多,但我確信C#中的SharpPcap具有此類功能。 jNetPcap是否也有,或者我錯過了什麼?

事情我已經嘗試:

  1. 使用pcap.inject()代替pcap.sendPacket(),但我的網卡不 似乎支持這個功能
  2. 設置捕捉方向只有 pcap.setDirection(Direction.IN)入站 - 這似乎絕對沒有 效果,數據包就像設置之前一樣被捕獲。

Ps。不幸的是,我必須用Java編寫它,如果jNetPcap庫沒有這個功能,請問,你能建議如何解決這個問題嗎?我正在考慮將發送的數據包緩存到某種類型的數組中,並檢查每個新檢測到的數據包是否與數組中的一個數據包相同 - 但這似乎是一個計算複雜的解決方案。

這裏是我的示例代碼(不是全部,只是相關件):

// Init 
Pcap pcap = Pcap.openLive(devices.get(0).getName(), 64*1024, Pcap.MODE_PROMISCUOUS, 1000, errbuf); 

... 


PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() { 
    public void nextPacket(PcapPacket packet, String user) { 
     // The duplicate packet that is sent in the sendAll() function also appears here 
     // Process the packet and add it to the forwarding buffer if needed 
     buffer.addPacket(packet); 
    } 
} 

// This is called in a separate thread, if some packets were added to the buffer 
public void sendAll(){ 
    while(buffer.hasNext() != 0){ 
     pcap.sendPacket(buffer.getNextPacket()); 
    } 
} 

同去的第二個接口。

非常感謝您的幫助。

回答

0

我意識到這是一個古老的,也許不是那麼流行的話題,但我終於通過添加一個緩衝區並不斷檢查重複項來解決這個問題。由於代碼複雜,我決定發佈關鍵功能,並且如何根據jnetpcap.com建議忽略該框架。

代碼:

// we're inside the nextPacket(PcapPacket currentPacket, String user) method 
buffer.lock(); 
for(int j = 0; j<buffer.size(); j++){ 
    if(currentPacket.getCaptureHeader().caplen() == buffer.get(j).getCaptureHeader().caplen() 
     && packet.size() == buffer.get(j).size()){ 

     buffer.erasePacket(j); 

     return; 
    } 

} 
buffer.unlock(); 
// continue packet processing 

隨意在你的項目中使用它。