C#套接字(Socket)通信之UDP組播詳解
組播的概念
UDP信息傳遞的方式分三類,分別是
- 單播 Unicast:客戶端與服務(wù)器之間的點(diǎn)到點(diǎn)連接
- 多播MultiCast:又稱組播,是“一對(duì)一組”的通訊模式,加入同一個(gè)組的主機(jī)可以接受到此組內(nèi)的所有數(shù)據(jù)。
- 廣播 BroadCast:主機(jī)之間“一對(duì)所有”的通訊模式,廣播者可以向網(wǎng)絡(luò)中所有主機(jī)發(fā)送信息。廣播禁止在Internet寬帶網(wǎng)上傳輸。
其中單播比較簡(jiǎn)單,在C#中可直接通過(guò)UdpClient點(diǎn)對(duì)點(diǎn)收發(fā)。
組播和單播的差別是,必須得有一個(gè)“組”的概念,然后才能進(jìn)行組播,在C#中,通過(guò)client.JoinMulticastGroup來(lái)實(shí)現(xiàn)。
另外,組播對(duì)IP地址的范圍有一定的要求:
起始IP | 截至IP | 適用范圍 | |
---|---|---|---|
224.0.0.1 | 224.0.0.255 | 預(yù)留地址,最好不要亂用 | |
224.0.1.0 | 224.0.1.255 | 公用地址,可用于互聯(lián)網(wǎng) | |
224.0.2.0 | 238.255.255.255 | 用戶可用,全網(wǎng)范圍 | |
239.0.0.0 | 239.255.255.255 | 本地 |
其中224.0.0.0
也是預(yù)留的組播地址,但保留不做分配。
簡(jiǎn)單示例
下面再頂級(jí)語(yǔ)句中做一個(gè)簡(jiǎn)單的示例
using System.Net; using System.Net.Sockets; using System.Text; static void Main() { UdpClient client = new UdpClient(5566); client.JoinMulticastGroup(IPAddress.Parse("235.5.6.8")); IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("234.5.6.7"), 7788); byte[] buf = Encoding.Default.GetBytes("Hello from multicast"); Thread t = new Thread(new ThreadStart(RecvThread)); t.IsBackground = true; t.Start(); while (true) { client.Send(buf, buf.Length, multicast); Thread.Sleep(1000); } } static void RecvThread() { UdpClient client = new UdpClient(7788); client.JoinMulticastGroup(IPAddress.Parse("234.5.6.7")); IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("235.5.6.8"), 5566); while (true) { byte[] buf = client.Receive(ref multicast); string msg = Encoding.Default.GetString(buf); Console.WriteLine(msg); } } Main();
函數(shù)RecvThread中,定義了一個(gè)端口號(hào)為7778的UDP客戶端,并通過(guò)JoinMulticastGroup添加了234.5.6.7這個(gè)IP地址。在死循環(huán)中,讓client不斷接收來(lái)自multicast的信息,其中multicast是地址為235.5.6.8,端口為5566的終端。
Main函數(shù)則創(chuàng)建了端口為5566的客戶端,然后不斷地向234.5.6.7:7788發(fā)送消息。
這個(gè)示例程序運(yùn)行之后,命令行中會(huì)不斷地輸出
Hello from multicast
但這個(gè)示例其實(shí)并沒(méi)有體現(xiàn)出“組播”的特點(diǎn),原因在于上面的代碼只用了一個(gè)地址,雖然用到了組播的模式,但實(shí)際操作上來(lái)看,還是一對(duì)一的。
組播的優(yōu)勢(shì)
下面稍微修改一下代碼,首先在RecvThread中新增一個(gè)IP
client.JoinMulticastGroup(IPAddress.Parse("234.5.6.9"));
然后在Main中新增一組發(fā)給新IP的信息,類似下面這樣
static void Main() { UdpClient client = new UdpClient(5566); client.JoinMulticastGroup(IPAddress.Parse("235.5.6.8")); IPEndPoint multi1 = new IPEndPoint(IPAddress.Parse("234.5.6.7"), 7788); IPEndPoint multi2 = new IPEndPoint(IPAddress.Parse("234.5.6.9"), 7788); byte[] buf1 = Encoding.Default.GetBytes("Hello multi1"); byte[] buf2 = Encoding.Default.GetBytes("Hello multi2"); Thread t = new Thread(new ThreadStart(RecvThread)); t.IsBackground = true; t.Start(); while (true) { client.Send(buf1, buf1.Length, multi1); client.Send(buf2, buf2.Length, multi2); Thread.Sleep(1000); } }
從而命令行輸出就會(huì)變成
Hello multi1
Hello multi2
也就是說(shuō),發(fā)給兩個(gè)不同IP地址的信息,都被client
接收到了。
到此這篇關(guān)于C#套接字(Socket)通信之UDP組播詳解的文章就介紹到這了,更多相關(guān)C# UDP組播內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#通過(guò)指針實(shí)現(xiàn)快速拷貝的方法
這篇文章主要介紹了C#通過(guò)指針實(shí)現(xiàn)快速拷貝的方法,涉及C#指針的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06C#調(diào)用OpenXml讀取excel行數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了C#如何調(diào)用OpenXml實(shí)現(xiàn)讀取excel行數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12winform中寫app.config文件時(shí)調(diào)試情況下沒(méi)有改變的原因
讀取很簡(jiǎn)單基本都用過(guò) ConfigurationManager.AppSettings[""].ToString() 寫config不是很常用2013-02-02C#使用三層架構(gòu)開(kāi)發(fā)Winform的詳細(xì)案例
這篇文章介紹了C#使用三層架構(gòu)開(kāi)發(fā)Winform的詳細(xì)案例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#數(shù)值轉(zhuǎn)換-隱式數(shù)值轉(zhuǎn)換表參考
隱式轉(zhuǎn)換就是直接使用,比如可以把一個(gè) byte 類型直接用在 int 上2013-04-04C#中使用Lambda表達(dá)式自定義比較器實(shí)現(xiàn)兩個(gè)列表合并實(shí)例
這篇文章主要介紹了C#中使用Lambda表達(dá)式自定義比較器實(shí)現(xiàn)兩個(gè)列表的合并實(shí)例,本文給出示例代碼和運(yùn)行效果,需要的朋友可以參考下2014-10-10C# 封裝HtmlHelper組件:BootstrapHelper
這篇文章主要介紹了C# 封裝HtmlHelper組件之BootstrapHelper 的相關(guān)資料,需要的朋友可以參考下2016-08-08