最近在寫一段分布式即時聊天的程式,為了實現內網使用者正常通訊,考慮使用組播的方式實現資料“廣播”
根據查詢的資料來看,UDP廣播只能在內網(同一網段)有效,而組播可以較好實現跨網段群發資料。
IP網路傳輸方式共分為單播,組播(多播),廣播三種。平時我們最常用的一對一的網路傳輸方式就是屬於單播;而組播是一對多的傳輸方式,其中有個組播組的
概念,發送端將資料向一個組內發送,網路中的路由器通過底層的IGMP協議自動將資料發送到所有監聽這個組的終端。至於廣播則和組播有一些相似,
區別是路由器向子網內的每一個終端都投遞一份資料包,不論這些終端是否樂於接收該資料包。
相對於極度消耗網路頻寬的廣播來說(廣播只能在內網廣播),UDP組播有了很大的最佳化,只有終端加入到了一個廣播組,UDP組播的資料才能被他接收到。
UDP組播是採用的無串連,資料報的串連方式,所以是不可靠的。也就是資料能不能到達接受端和資料到達的順序都是不能保證的。但是由於UDP不用保證資料
的可靠性,所有資料的傳送速度是很快的。
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之間不能進行通訊。
- 建立socket
- socket和連接埠綁定
- 加入一個組播組
- 通過sendto / recvfrom進行資料的收發
- 關閉socket
IPAddress ip = IPAddress.Parse("224.1.2.3");
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);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);
s.Bind(ipep);
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("224.1.2.3"), IPAddress.Any));
......
s.Receive(b, 4, SocketFlags.None);
......
s.Close();