加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何通过接口过滤组播接收套接字?

发布时间:2020-12-13 18:53:31 所属栏目:Linux 来源:网络整理
导读:我需要创建两个侦听同一IP:端口但在不同接口上的套接字: socket0接收在接口eth0上发送到224.2.2.2:5000的UDP流量 socket1接收在接口eth1上发送到224.2.2.2:5000的UDP流量 直到我意识到Linux将所有这些合并到相同的流量中之前,它似乎非常直接.例如,假设eth1

我需要创建两个侦听同一IP:端口但在不同接口上的套接字:

> socket0接收在接口eth0上发送到224.2.2.2:5000的UDP流量
> socket1接收在接口eth1上发送到224.2.2.2:5000的UDP流量

直到我意识到Linux将所有这些合并到相同的流量中之前,它似乎非常直接.例如,假设eth1上只有流量,而且eth0没有活动.当我第一次创建socket0时,它不会接收任何数据,但是一旦我创建socket1(并加入多播组),socket0也将开始接收相同的数据.我发现this link解释了这一点.

现在这对我来说实际上是有道理的,因为我指定网络接口的唯一时刻是使用ip_mreq.imr_interface.s_addr加入多播组setsockopt(socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,…).我相信这指定哪个接口加入组但与套接字将从哪个接口接收无关.

到目前为止我尝试将套接字绑定到多播地址和端口,其行为如上所述.我已经尝试绑定到接口地址,但这在Linux上不起作用(虽然它似乎在Windows上这样做),你在套接字上没有收到任何流量.最后,我尝试绑定到INADDR_ANY,但这不是我想要的,因为我将收到发送到端口的任何其他数据而不管目标IP,例如单播,并且它仍然不会停止来自其他的组播数据接口.

我不能使用SO_BINDTODEVICE,因为它需要root权限.

所以我想知道的是,这是否可行.如果不能做到那就没关系,我会把它作为一个答案并继续前进,我只是无法找到任何方法.哦,我把这个问题标记为C,因为这就是我们正在使用的东西,但我认为它真的可能不是特定于语言.

我没有包含此代码,因为我认为它更多的是理论问题,而不是源代码的问题.我们一直在使用套接字(多播或其他)一段时间没有任何问题,这只是我们第一次必须处理多个接口.但如果你认为它可能有所帮助,我可以写一些最小的工作示例.

编辑possible duplicate:

我认为我在这里尝试实现的用例是不同的.套接字应该从同一个组播组和端口(上例中的224.2.2.2:5000)接收数据,但只能从一个特定接口接收数据.换句话说,两个接口都从同一个组播组接收数据(但不同的网络,因此数据不同),我需要每个套接字只能在一个接口上监听.

我认为这个问题是关于同一端口上的多个组,而不是来自不同接口的相同组.除非有一些我没有看到的东西,实际上可能对我有所帮助.

最佳答案
是的,您可以在没有root权限的情况下在Linux上执行您想要的操作:

绑定到INADDR_ANY并设置IP_PKTINFO套接字选项.然后,您必须使用recvmsg()接收多播UDP数据包并扫描IP_PKTINFO控制消息.这为您提供了收到的UDP数据包的一些边带信息:

struct in_pktinfo {
    unsigned int   ipi_ifindex;  /* Interface index */
    struct in_addr ipi_spec_dst; /* Local address */
    struct in_addr ipi_addr;     /* Header Destination address */
};

ipi_ifindex是接收数据包的接口索引. (您可以使用if_indextoname()将其转换为接口名称,或者使用if_nametoindex()将其转换为其他方式.

正如您在Windows上所说的那样,相同的网络功能具有不同的语义,特别是对于UDP,甚至更多用于多播.

UDP套接字的IP地址的Linux bind()语义大多没用.它本质上只是一个目标地址过滤器.您几乎总是希望绑定到INADDR_ANY以获取UDP套接字,因为您不关心数据包发送到哪个地址,或者您想要接收多个地址的数据包(例如,接收单播和多播).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读