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;
(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);
相關文章
- C#實現組播源及客戶端C#客戶端
- Java 基於UDP 實現單播、組播、廣播 Socket 程式設計JavaUDP程式設計
- IP組播
- 組播地址
- 單播、多播(組播)和廣播的區別
- 組播和廣播的區別
- HCNP Routing&Switching之組播技術-組播地址
- IPSec組播概要
- HCNP Routing&Switching之組播技術-組播基礎
- HCNP Routing&Switching之組播技術-組播分發
- 組播協議詳解協議
- HCNP Routing&Switching之組播技術-組播協議IGMP協議
- HCNP Routing&Switching之組播技術-組播路由協議PIM路由協議
- C++ Qt開發:QUdpSocket實現組播通訊C++QTUDP
- 華為 組播理論知識
- 組播地址Multicase address
- vlc的應用:用vlc做單播,組播及點播伺服器伺服器
- java傳送接收組播(多播)資料包(UDP包)JavaUDP
- IP組播網路程式設計程式設計
- 組播分發 SPT&RPT
- IP組播基礎及工作原理——1
- 大眾傳播、流行品味與組織化社會行為
- 組播IP地址到底是誰的IP?
- SpringCloud 2020.0.4 系列之 Stream 訊息廣播 與 訊息分組 的實現SpringGCCloud
- 65.QT-UDP組播實現多人共享桌面(同時支援收發顯示)QTUDP
- Presto資源組配置REST
- ffmpeg無法接收組播流問題處理
- Axure實現輪播效果
- ViewPage實現輪播圖View
- Banner實現輪播圖
- js實現輪播圖JS
- jQuery實現輪播效果jQuery
- OCM實驗-GC資源管理器資源消耗組演示GC
- 組播推流工具有接單的小夥伴不?
- 集團重組專業化公司實現人力資源共享
- Android輪播圖控制元件的實現詳解(附GitHub開源連結)Android控制元件Github
- css實現滾動輪播CSS
- 原生js實現輪播圖JS