Linux
我應該在 RHEL/CentOS 上為盲發者創建多播路由嗎?
CentOS 5 系統似乎沒有開箱即用的多播流量路由。它看起來確實是使用預設路由(如果已配置)。換句話說,這樣的路由表:
# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 10.42.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 10.42.128.1 0.0.0.0 UG 0 0 0 eth0
將與我的基於 Java 的多播客戶端應用程序(或下面的測試案例)一起使用,它希望能夠發送到站點本地多播地址。
此設置有效。如果我沒有預設路由,例如
Destination Gateway Genmask Flags MSS Window irtt Iface 10.42.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
我的 Java 應用程序在嘗試發送時會失敗。我可以通過添加多播路由來糾正這個問題:
# route add -net 224.0.0.0/4 via eth0
並永久執行上述操作:
# echo 224.0.0.0/4 via eth0 >>/etc/sysconfig/network-scripts/route-eth0
無論如何我應該創建這條路線嗎?讓預設路由處理多播流量有什麼害處,除瞭如果預設路由消失它會停止工作的事實嗎?
這是一個簡短的測試案例,可以通過執行
javac Sender.java; java Sender
. 它向站點本地地址 239.192.0.1 發送一個 0 字節的 UDP 數據包。如果我沒有預設路由,它將失敗Exception in thread "main" java.io.IOException: Network is unreachable at java.net.PlainDatagramSocketImpl.send(Native Method) at java.net.DatagramSocket.send(DatagramSocket.java:629) at Sender.main(MulticastSender.java:7)
但是,如果存在預設路由(或我上面提到的多播路由),它將成功地將數據包發送到 239.192.0.1。
Sender.java
import java.net.*; class Sender { public static void main(String[] args) throws Throwable { MulticastSocket socket = new MulticastSocket(); InetAddress groupAddress = InetAddress.getByName("239.192.0.1"); socket.send(new DatagramPacket(new byte[0], 0, groupAddress, 9999)); } }
您應該只需要在您的主機中添加一個路由是多宿主的。
看:
http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration
否則,預設路由會做正確的事情。
您通常不希望使用多播路由。不需要。
顯示什麼
netstat -gn
?預設情況下,連接應該從編號最小的介面eth0出去。請參閱我在以下位置記錄的步驟:多播似乎不適用於 RHEL 5.5