2011-03-30 81 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