2016-01-22 84 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)

您没有第三个选项。