1 組播原理組播的概念是在IP層定義的,一些特殊的IP地址被規定為組播IP地址,不能配置為某個主機的IP。具體說來,組播使用的IP地址是整個D類地址,即:整個D類地址是不能配置到主機網卡上的,它們專門供組播使用。2 FCL中實現UDP組播的兩種方式FCL為使用UDP提供了兩個類,一個是基礎的Socket,一個是封裝了Socket的UdpClient。需要說明的是,組播的特殊性只是在接收方才存在,對於發送方,直接向組播IP地址發送即可,與單播無異。發送程式如下:
class Program { private static UdpClient client = new UdpClient(6000); static void Main(string[] args) { byte[] bytes = Encoding.UTF8.GetBytes("hello"); while (true) { Thread.Sleep(1000); client.Send(bytes, bytes.Length, new IPEndPoint(IPAddress.Parse("224.0.0.101"), 6005)); } } }2.1 使用UdpClient由於UdpClient對Socket進行了很好的封裝,所以使用起來比較方便,本身就提供了加入組播組的方法。代碼如下:
public class UDPMulticastListener { public static void Main(String[] args) { UdpClient udpClient = new UdpClient(6005); udpClient.JoinMulticastGroup(IPAddress.Parse("224.0.0.101")); IPEndPoint remoteEp = new IPEndPoint(IPAddress.Any, 0); while (true) { Byte[] buffer = udpClient.Receive(ref remoteEp); String msg = Encoding.UTF8.GetString(buffer); Console.WriteLine(msg); } } }
MSDN上提醒:調用JoinMulticastGroup之前,必須為udpClient綁定了連接埠。
2.2 使用SocketSocket提供了最基礎和靈活的控制,需要通過SetSocketOption()方法來加入組播組。代碼如下:
public class UDPMulticastListener { public static void Main(String[] args) { Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); listener.Bind(new IPEndPoint(IPAddress.Any, 6005)); MulticastOption mcastOption = new MulticastOption(IPAddress.Parse("224.0.0.101"), IPAddress.Parse("172.16.35.220")); listener.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOption); while (true) { byte[] buffer = new byte[1024]; int n = listener.Receive(buffer); String msg = Encoding.UTF8.GetString(buffer, 0, n); Console.WriteLine(msg); } } }
需要注意的是,指定MulticastOption的時候,必須為其指定要使用網卡源IP地址,否則組播不能成功。
3 抓包分析乙太網路中UDP組播實現通過上面執行個體可以看出,在C#中使用組播非常簡單。組播在乙太網路中是如何?的呢?首先,與IP地址一樣,乙太網路中的MAC地址也有一部分專門供組播使用,他們的特徵是最高位元組的最低位是1,這些MAC地址不能作為網卡的MAC,只能是組播MAC。對這些MAC的處理是這樣的:交換器會把目的MAC是組播MAC的包轉寄到同一VLAN的所有連接埠,主機上的網卡不僅接收目的MAC是自己Mac的,也接收目的MAC是組播MAC的包,然後把收到的包剝去以太層交給IP層、UDP層繼續處理。在IP層,如果發現目的IP是組播IP,並且本機已加入了這個組播組,則交由對應的應用程式處理,否則丟棄。關於組播IP於組播MAC的對應規則有專門的規定。關於組播有一篇英文妙文,http://www.firewall.cx/networking-topics/general-networking/107-network-multicast.html。