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

luckyone906發表於2017-06-09

        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);

相關文章