C#實現任意源組播與特定源組播


        IP組播通信需要一個特殊的組播地址,IP組播地址是一組D類IP地址,范圍從224.0.0.0 到 239.255.255.255。其中還有很多地址是為特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因為他們大多是為了特殊的目的保持的(比如IGMP協議)。

        IGMP是IP組播的基礎。在IP協議出現以后為了加入對組播的支持,IGMP產生了。IGMP所做的實際上就是告訴路由器,在這個路由器所在的子網內有 人對發送到某一個組播組的數據感興趣,這樣當這個組播組的數據到達后面,路由器就不會拋棄它,而是把他轉送給所有感興趣的客戶。假如不同子網內的A和B要 進行組播通信,那么位於AB之間的所有路由器必須都要支持IGMP協議,否則AB之間不能進行通信。

1 使用Socket實現任意源組播

    利用C#實現UDP組播的基本步驟為:
     (1)建立socket;
     (2)socket和端口綁定;
     (3)加入一個組播組國;
     (4)通過sendto / recvfrom進行數據的收發;
     (5)關閉socket。
    下面是簡單的示例:
      (1)發送示例:
             IPAddress ip = IPAddress.Parse("226.1.1.2");
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1);
            IPEndPoint ipep = new IPEndPoint(ip, 5000);
            ......
            s.SendTo(buff, buff.Length, SocketFlags.None, ipep);
            ......
            s.Close();
      (2)接收示例:
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5980);
            s.Bind(ipep);
            s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                new MulticastOption(IPAddress.Parse("226.1.1.2"), IPAddress.Any));
            ......
            s.Receive(b, 4, SocketFlags.None);
            ......
            s.Close();

2 使用Socket實現特定源組播

    特定源組播(Source Specific Multicast, SSM)提供給主機應用程序一個“通道”抽象,每個通道擁有一個源和多個接收者。組播源可以發送一個IP報文給SSM目的地址G,接受者可以加入通道(S,G)來接收該報文。IPv4地址范圍232/8已經被IANA分配給SSM服務。使用C#實現特定源組播時,需要設置SocketOption參數,具體設置如下:
      byte[] membershipAddresses = new byte[12]; // 3 IPs * 4 bytes (IPv4)
      Buffer.BlockCopy(multicastIp.GetAddressBytes(), 0, membershipAddresses, 0, 4);    //組播地址
      Buffer.BlockCopy(sourceIp.GetAddressBytes(), 0, membershipAddresses, 4, 4);       //組播源地址
      Buffer.BlockCopy(localIp.GetAddressBytes(), 0, membershipAddresses, 8, 4);          //本地接收地址
      socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, membershipAddresses);
 
http://m.blog.csdn.net/article/details?id=11715903


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM