FCL應用技巧之——實現UDP組播

來源:互聯網
上載者:User
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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.