将AF_PACKET套接字绑定到所有接口

时间:2016-05-18 08:47:12

标签: linux sockets

我想编写一个应该接收所有传入数据包的应用程序,无论数据包是发往我的机器还是假设要转发或数据包发往本地主机。

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

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

 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);

1 个答案:

答案 0 :(得分:3)

执行man socket给出:

  

AF_PACKET低级别数据包接口数据包(7)

man 7 packet给出:

  

默认情况下,将传递指定协议类型的所有数据包   数据包套接字。仅从特定接口使用获取数据包   bind(2)指定struct sockaddr_ll中的地址来绑定   数据包套接字到接口。只有sll_protocol和   sll_ifindex地址字段用于绑定。

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

单个套接字不能绑定到多个接口。如果要获取子集,请创建多个套接字并将它们全部绑定。使用select或其中一个更好的兄弟姐妹(Linux上为epoll_pwait)等待其中任何一个人收到数据包。