gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:12 29 4
gpt4 key购买 nike

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com