【问题标题】:binding the AF_PACKET socket to all interfaces将 AF_PACKET 套接字绑定到所有接口
【发布时间】:2016-05-18 08:47:12
【问题描述】:

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

为此,我打开了一个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);

【问题讨论】:

    标签: linux sockets


    【解决方案1】:

    执行man socket 给出:

    AF_PACKET 低级包接口包(7)

    man 7 packet 给出:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 2013-01-06
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多