如何将多个接口绑定到原始套接字

时间:2016-01-22 12:32:42

标签: linux sockets linux-kernel

我打开了一个原始套接字来获取所有原始数据包:

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)

当在作为LAG或绑定成员的接口上接收到数据包时,内核将数据包发送到用户应用程序2次。一个用于实际物理接口,另一个用于绑定接口。如何限制内核只为我感兴趣的接口解除数据包?

我们可以通过将应用程序感兴趣的接口绑定到套接字来实现它。但我不想创建多个套接字(每个接口一个)以避免可伸缩性问题。是否可以动态地将多个接口绑定到原始套接字?

1 个答案:

答案 0 :(得分:1)

使用SO_BINDTODEVICE套接字选项绑定到特定接口:

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

在这种情况下,您必须为每个接口创建单独的套接字。

替代解决方案是将bind(2)与INADDR_ANY一起使用。

您没有第三种选择。