linux - 将 AF_PACKET 套接字绑定(bind)到所有接口(interface)

标签 linux sockets

我想编写一个应用程序,它应该接收所有传入的数据包,而不管数据包是发往我的机器并假设被转发还是发往本地主机。

为此,我打开了一个 AF_PACKET 套接字。但是,由于我的机器有多个接口(interface),我如何将套接字绑定(bind)到多个接口(interface)以捕获来自任何接口(interface)的所有传入数据包。

以下代码段将我的套接字仅绑定(bind)到一个接口(interface)。我如何修改它以与所有接口(interface)绑定(bind)。另外,我如何绑定(bind)到一些接口(interface)集,我可以在同一个套接字上多次调用绑定(bind)以绑定(bind)不同的接口(interface)吗?

 strncpy ((char *) ifr.ifr_name, interface, IFNAMSIZ);
 ioctl (sock, SIOCGIFINDEX, &ifr);
 sll.sll_family = AF_PACKET;
 sll.sll_ifindex = ifr.ifr_ifindex;
 sll.sll_protocol = htons (ETH_P_IP);

 if(bind ( sock, (struct sockaddr *) &sll, sizeof (sll) ) )
 {
     perror("Bind");
     exit(1);
 }

 //len = recvfrom(sock, rec_buff, 5000,0,(struct sockaddr *)&client_addr, &addr_len);
 len = read(sock, rec_buff, 5000);

最佳答案

执行 man socket 得到:

AF_PACKET Low level packet interface packet(7)

man 7 packet 给出:

By default all packets of the specified protocol type are passed to a packet socket. To get packets only from a specific interface use bind(2) specifying an address in a struct sockaddr_ll to bind the packet socket to an interface. Only the sll_protocol and the sll_ifindex address fields are used for purposes of binding.

因此,至少根据手册页,如果要从所有接口(interface)捕获,只需不要绑定(bind)套接字即可。

单个套接字不能绑定(bind)到多个接口(interface)。如果你想得到一个子集,创建多个套接字并将它们全部绑定(bind)。使用 select 或其更好的兄弟之一(Linux 上的 epoll_pwait)等待它们中的任何一个接收数据包。

关于linux - 将 AF_PACKET 套接字绑定(bind)到所有接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294540/

相关文章:

c++ - 从 Linux 中的非子进程获取退出代码

linux - 从 bash 脚本读取 makefile 变量

linux - ">/dev/null 2>&1"和 "2>/dev/null >&2"有什么区别

退出 fork 窗口管理器后无法输入 GtkEntry

python - Python 中的 UDP 套接字 : How to clear the buffer and ignore oldes messages

linux - 允许特定的 linux 用户绑定(bind)到端口 443

c - 关于套接字/tcp 连接的多线程的问题

sockets - 多个 UDP 套接字用于监听同一端口上的特定源

c++ - 编译器优化创建系统调用?

c - 在同一 while 循环中接受用户输入和传入连接