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;
(1)建立socket;
(2)socket和端口綁定;
(3)加入一個組播組國;
(4)通過sendto / recvfrom進行數據的收發;
(5)關閉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();
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();
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);
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