linux - 如何将多个接口(interface)绑定(bind)到原始套接字

标签 linux sockets linux-kernel

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

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)

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

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

最佳答案

使用 SO_BINDTODEVICE 套接字选项绑定(bind)到特定接口(interface):

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

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

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

你没有第三种选择。

关于linux - 如何将多个接口(interface)绑定(bind)到原始套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946831/

相关文章:

linux - Linux 内核源代码中 _PAGE_OFFSET 值定义的位置

c# - C++ 套接字读取端读取所有连接的消息

Java 套接字服务器和 MySQL

linux - Docker 检查命令未显示所有 ENV 变量

c++ - 包含来自 CUDA 10.0 的 npps.h 时发生链接错误

python - 来回 unix 域套接字锁

c - 在 Linux 内核中混合汇编和 C 函数 - x64 模式

linux-kernel - 使用 QEMU 和 GDB 调试 xv6 时无法访问内核空间

C : how can I change from file descriptor to FILE struct and vice versa?

php - 运行 shell 脚本,然后从 PHP 显示文件的内容