2016-01-22 40 views
0

我已經開了一個原始套接字來獲取所有的原始數據包:如何將多個接口綁定到一個原始套接字

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) 

當這是一個LAG或債券,該成員的接口上接收到數據包內核正在向用戶應用程序發送數據包2次。一個用於實際的物理接口,另一個用於接口接口。我怎樣才能限制內核解除只爲我感興趣的接口的數據包?

我們可以通過將應用程序感興趣的接口綁定到套接字來實現它。但我不想創建多個套接字(每個接口一個套接字)以避免可伸縮性問題。是否有可能將多個接口動態綁定到原始套接字?

回答

1

使用SO_BINDTODEVICE套接字選項綁定到特定的接口:

char *iface = "eth0"; 
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, iface, 4); 

在這種情況下,你必須爲每個接口創建單獨的插座。

另一種解決方案是使用帶有INADDR_ANY的bind(2)

您沒有第三個選項。

相關問題