2017-01-16 27 views
0

我想在Linux中接收來自套接字的以太網數據包,但只有那些具有兩個自定義Ethtype值之一的套接字。 據我所知,如果只有1 ethtype應該被接收,這是可能的,而這樣的接收Linux中的以太網數據包,並在C中有多個EthTypes

int socket = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_CUSTOM_1); 

但是創造插座如果我有2個不同的ethtypes可以指定這個值?我應該使用2個套接字還是寫一些自定義過濾器?或者有什麼簡單的方法?

+1

我會使用2個套接字,這樣你的代碼就不會爲系統收到的每個數據包運行,只是爲了過濾掉大部分數據包。 – Barmar

+0

您也可以考慮使用一個套接字來設置捕獲所有內容,然後安裝BPF程序。事實上,我只是使用libpcap並利用'pcap_setfilter'函數,它在linux上知道如何將BPF安裝到內核中。 'link'指令應該允許你在鏈接頭中指定相應的字段來進行比較。 –

+0

@Barmar請將您的評論添加爲答案 – user3237732

回答

1

創建兩個套接字,每個ethertype一個套接字。然後,您可以使用select()epoll()同時等待任一套接字上的數據包。

0

我認爲你應該使用libpcap庫。您需要訪問bpf打包程序過濾器。 這很簡單。 或者你可以使用iptables規則一個netfilter庫。您需要設置prerouting iptables規則將所有數據包轉發到特定的端口,並且您的應用程序將此端口綁定爲監聽模式,並且您可以接收完整數據包。

相關問題