桌面共用UDP組播實現

来源:https://www.cnblogs.com/liuxiaobo93/archive/2018/12/20/10147541.html
-Advertisement-
Play Games

之前有寫過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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參數含義:ABURL:要下載的AB包地址 go:用於測試,顯示載入貼圖 assetName:要載入的資源名稱 (在調用之前要對參數初始化) ...
  • 技術交流,請加QQ群:538327407 我的各種github 開源項目和代碼:https://github.com/linbin524 背景 筆者 目前架構的IOT 項目是使用abp 框架作為後臺,雖然abp的框架適用於中小型項目框架,但由於架構優美,筆者認為還是可以經過改造,作為大型項目中使用。 ...
  • 目前Web開發,大部分公司都用的是前後端分離模式,即前端專註於前端頁面交互,後端專註於功能實現及提供Web Api介面。 在某次新站點的開發過程中,為了網站的安全性,要求Web站點使用https協議,在部署到QA環境時,發現調用介面報如下的錯: 從提示的內容來看,大致可推斷出是因為站點是https協 ...
  • 前言 解析Excel有知名的NPOI庫,(Java語言是POI),但是NPOI是不支持解析csv的。 csv本質上也是文本文件,可以進行差異對比,更利於解決衝突。 本文對解析csv的幾個.net的開源庫進行調研 很小巧簡單的庫:https://github.com/stevehansen/csv/ ...
  • RabbitMQ配置環境花費了好多時間,特記錄此筆記,方便下次部署安裝。筆記中將常見的安裝錯誤問題、解決辦法與安裝過程一同展示。 ...
  • 第一次寫隨筆 應該寫的不是太好 請多多見諒 我這次是在網上發現了一個三級聯動 也是給新人一個福利 這個是你需要新建個 JavaScript 文件 並複製到你新建的文件裡面 1 var provinces = [ 2 { 3 "name": "北京市", 4 "city": [ 5 { 6 "name ...
  • 環境 本地 win7 伺服器:Virtual Box 上的Centos ssh工具: Xshell 文件傳輸: xftp 1.在本地創建asp.net core應用發佈 1.1 使用Vs2017 新建一個asp.netcore項目 步驟略(一路next),當然你也可以用命令行創建。 1.2 發佈項目 ...
  • 列印預覽XAML代碼: <controls:WindowEx x:Class="SunCreate.Vipf.Client.UI.MapPrintPreview" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...