我想問你一個具體的問題:我想發展與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是否也有,或者我錯過了什麼?
事情我已經嘗試:
- 使用
pcap.inject()
代替pcap.sendPacket()
,但我的網卡不 似乎支持這個功能 - 設置捕捉方向只有
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());
}
}
同去的第二個接口。
非常感謝您的幫助。