2011-03-30 144 views
7

要收到我不是默认NIC(DVB)我做了以下多播:具有多个接口(Linux)的服务器上接收多播

  • 打开套接字(AF_INET,SOCK_DGRAM)
  • 加盟在DVB接口上IP_ADD_MEMBERSHIP多播地址
  • 结合的多播地址(注意:一个常见的错误是绑定“0.0.0.0”,然后接收插座上,即使播你不感兴趣的)和端口

此时接收所需多播数据包的唯一方法是在路由表中添加规则,以便通过dvb到达发送者所在的网络(另一个网络),就好像dvb需要回复多播发送者一样;让我们说一种源发送者多播模式。任何人都知道发生了什么事?这个问题令我烦恼,因为原则上我不知道发件人的IP地址。

回答

9

您似乎被rp_filter反向路径过滤所刺激。如果数据包到达没有源地址路由的接口,则会丢弃数据包。

可以使用sysctl /proc/sys/net/ipv4/conf/<if>/rp_filter以每个接口为基础禁用它。

+1

这似乎是解决方案,我也发现这个网页上有用的信息http://ifup.org/2011/02/03/reverse-path-filter-rp_filter-by-example/ – thrantir 2011-03-31 06:57:47

+0

这工作,但我们不得不禁用rp_filter不在接收多播的接口上,而是在默认路由表中使用的接口上。 – 2011-03-31 07:56:36

+0

不幸的是,@ thrantir的链接不再有效。 – 2014-05-10 01:10:21

0

绑定组播地址

这肯定是不对的。您必须绑定到实际适配器的实际IP地址,或0.0.0.0。

注意,一个常见的错误是绑定 “0.0.0.0”

这是不是一个错误。除非你只想听一个IP地址,否则这是正确的过程。

,然后会得到那个 插座甚至播你是不是 兴趣

我不知道这意味着什么。

原则上我不知道发件人

任何UDP数据包的发送者的IP地址的IP是通过套接字API可用。

+3

没有,你需要绑定多播地址,如果绑定真正的适配器的IP地址,你将不会收到任何多播数据包,如果你绑定到0.0.0.0,你打开你的IP过滤器到任何多播。为了在目标IP(在这种情况下为多播地址)的基础上进行完美的软件过滤,然后只接收“该”多播,您需要*绑定*多播。我建议你阅读UNP中的组播章节。 – 2011-03-30 10:18:53

+0

@Gaetano Mendola:13年前我读过谢谢。它不适用于Windows,它没有意义w.r.t.公认的'绑定'的定义。 – EJP 2011-04-05 10:40:33

+1

这个事实在Windows上不起作用并不意味着它是错误的。 Windows IP协议栈不是很有名的标准,也请注意我已经提出了我的问题:linux。然后再次在我们的中间件上我们知道它,并且在定义了WIN32的情况下我们绑定了接口的IP地址,但是如果你有一个“好的”IP堆栈,这又是错误的。 – 2011-04-06 09:57:29

相关问题