之前有寫過c#區域網桌面共用軟體製作(https://www.cnblogs.com/liuxiaobo93/p/3675387.html),完成了一個簡易的點對點的桌面共用demo,使用的就是Tcp協議,當時由於接收端接收數據用了一個比較大的byte數組來一次性接收完整張圖片數據,所以有人提出了問... ...
組播(Multicast)傳輸:在發送者和每一接收者之間實現點對多點網路連接。如果一臺發送者同時給多個的接收者傳輸相同的數據,也只需複製一份的相同數據包。它提高了數據傳送效率。減少了骨幹網路出現擁塞的可能性。
廣播(Broadcast)傳輸:是指在IP子網內廣播數據包,所有在子網內部的主機都將收到這些數據包。廣播意味著網路向子網每一個主機都投遞一份數據包,不論這些主機是否樂於接收該數據包。所以廣播的使用範圍非常小,只在本地子網內有效,通過路由器和網路設備控制廣播傳輸。
優點:
1、具有同種業務的主機加入同一數據流,共用同一通道,節省了帶寬和伺服器的優點,具有廣播的優點而又沒有廣播所需要的帶寬。
2、伺服器的總帶寬不受客戶端帶寬的限制。由於組播協議由接收者的需求來確定是否進行數據流的轉發,所以伺服器端的帶寬是常量,與客戶端的數量無關。
3、與單播一樣,組播是允許在廣域網即Internet上進行傳輸的,而廣播僅僅在同一區域網上才能進行。
缺點:
1、組播與單播相比沒有糾錯機制,當發生錯誤的時候難以彌補,但是可以在應用層來實現此種功能。
2、組播的網路支持存在缺陷,需要路由器及網路協議棧的支持。
3、組播的應用主要有網上視頻、網上會議等。
組播IP地址用於標識一個IP組播組。IANA(internet assigned number authority)把D類地址空間分配給IP組播,其範圍是從224.0.0.0到239.255.255.255。如下圖所示(二進位表示),IP組播地址前四位均為1110八位組⑴ 八位組⑵ 八位組⑶ 八位組⑷1110
XXXX XXXXXXXX XXXXXXXX XXXXXXXX組播組可以是永久的也可以是臨時的。組播組地址中,有一部分由官方分配的,稱為永久組播組。永久組播組保持不變的是它的ip地址,組中的成員構成可以發生變化。永久組播組中成員的數量都可以是任意的,甚至可以為零。那些沒有保留下來供永久組播組使用的ip組播地址,可以被臨時組播組利用。
224.0.0.0~224.0.0.255為預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協議使用。
224.0.1.0~238.255.255.255為用戶可用的組播地址(臨時組地址),全網範圍內有效。
239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地範圍內有效。常用的預留組播地址列表如下:
224.0.0.0 基準地址(保留)
224.0.0.1 所有主機的地址
註:廣播方和接受方的埠號相同才能收到廣播
之前有寫過c#區域網桌面共用軟體製作(https://www.cnblogs.com/liuxiaobo93/p/3675387.html),完成了一個簡易的點對點的桌面共用demo,使用的就是Tcp協議,當時由於接收端接收數據用了一個比較大的byte數組來一次性接收完整張圖片數據,所以有人提出了問題,為什麼不用“迴圈接收數據以節省記憶體分配”呢?的確,固定緩衝區大小這種方式在設計上存在缺陷,所以我們參考RTP包的方式對圖片數據進行分包傳輸。這樣做也避免了出現大部分圖片黑屏的情況。
每個數據包為定長的位元組數組,定義第一位為通道標識第二位為數據標識,預定義格式如下:
/// <summary> /// 0類型通道:1圖片 2命令 3音頻 /// 1數據通道: /// [1圖片]:0x0A圖像頭 0x0B圖像Body 0x0C圖像尾 /// [2命令]:0x0E 狀態命令 /// [3音頻]:0x0F /// </summary>
定長則參考MTU,我們取值1460
最大傳輸單元(Maximum Transmission Unit,MTU)是指一種通信協議的某一層上面所能通過的最大數據包大小(以位元組為單位)。最大傳輸單元這個參數通常與通信介面有關(網路介面卡、串口等)。
//服務端創建Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ServerSocket.SendBufferSize = 1024 * 1024 * 5; //發送數據 GroupEP = new IPEndPoint(IPAddress.Parse(組播地址), 組播埠); ServerSocket.SendTo(byte[], GroupEP); //客戶端創建Socket UdpReceive = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); UdpReceive.ReceiveBufferSize = 1024 * 1024 * 5; UdpReceive.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(組播地址)); //綁定埠 IPEndPoint ipe = new IPEndPoint(客戶端IP, 組播埠); UdpReceive.Bind(ipe); //接收數據 UdpReceive.Receive(byte[]);
1.配置和啟動服務
2.客戶端添加伺服器
3.將伺服器拖到空白麵板,開始查看共用桌面
Svn地址:https://gitee.com/xiaoboliu/DesktopShare
有興趣的同學可以一起研究,先把基本功能完善好,後面有必要的話再重構吧!
本文地址:https://www.cnblogs.com/liuxiaobo93/p/10147541.html