我想编写一个应用程序,它应该接收所有传入的数据包,而不管数据包是发往我的机器并假设被转发还是发往本地主机。
为此,我打开了一个 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/