首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

基於 Socket 通訊的遠端螢幕截取、顯示與控制技術實現

     編輯:關於VC++

前言

遠端控制技術在設備維護、系統監控與故障診斷等領域擁有廣泛的應用前景,主流架構多採用 Client/Server 模式。此架構由網路上的多台電腦組成:發起服務請求的稱為客戶端(本地端),響應並處理請求的稱為伺服器端(目標端)。

遠端控制核心原理

使用者透過網路連線,客戶端程式發送身分驗證資訊與連線請求;伺服器端驗證通過後建立連線,雙方即可進行指令傳遞與畫面同步。客戶端發送執行指令,伺服器端執行後將鍵盤、滑鼠事件與螢幕重繪資料回傳,客戶端解析顯示,使用者即能如同親自操作遠端主機般進行控制。此模式稱為「基於遠端服務的遠端控制」。

要實現完整的遠端控制,需解決三大核心問題:雙機 Socket 網路通訊、遠端螢幕截取顯示、螢幕資料傳輸與控制邏輯。

一、雙機 Socket 網路通訊實現

基於 Windows 平台的 Winsock 程式設計流程如下:

伺服器端初始化與建立

  1. 初始化 Winsock:呼叫 WSAStartup 載入 DLL,版本資訊存於 WSADATA 結構。
  2. 建立 Socket:使用 socket(AF_INET, SOCK_STREAM, 0) 建立串流式套接字,取得句柄 SOCKET。
  3. 綁定本地位址:透過 bind 將 Socket 綁定至特定 IP 與埠號(sockaddr_in 結構)。
  4. 監聽連線請求:listen 設定佇列長度,accept 阻塞等待客戶端連線,成功則產生新 Socket 進行通訊。

客戶端初始化與連線

  1. 同樣初始化 Winsock 並建立 Socket。
  2. 設定目標伺服器 sockaddr_in(IP、埠號需與伺服器一致)。
  3. 可選:用 setsockopt 設定超時、緩衝區;用 ioctlsocket 設定非阻塞模式。
  4. 呼叫 connect 發起連線,伺服器端 accept 返回新 Socket 完成三方交握。

資料收發與關閉

連線建立後,雙方可使用 send/recv 或 Write/Read 進行資料傳輸。通訊結束時,雙方呼叫 closesocket 關閉 Socket,並以 WSACleanup 釋放 Winsock 資源。

Winsock 套接字主要工作流程

圖 1:Winsock 套接字主要工作流程(①~⑩ 標示資料交換順序)

二、遠端螢幕截取與裝置無關位圖(DIB)轉換

伺服器端接收截圖請求後,需將螢幕畫面擷取為可跨裝置傳輸的標準格式。

2.1 取得裝置相關位圖(DDB / GDI 位圖)

  1. 呼叫 GetSystemMetrics(SM_CXSCREEN/CYSCREEN) 取得螢幕解析度,確定截取範圍。
  2. 建立顯示裝置 DC(CreateDC("DISPLAY"))、相容記憶體 DC(CreateCompatibleDC)與相容位圖(CreateCompatibleBitmap)。
  3. 用 SelectObject 選入位圖,再以 StretchBlt 將螢幕內容複製至記憶體 DC,獲得 GDI 位圖(HBITMAP)。

GDI 位圖格式依賴顯示裝置,跨電腦傳輸無意義,必須轉為裝置無關位圖(DIB)。

2.2 DDB 轉 DIB 關鍵步驟

DIB 內含色彩資訊(調色板),為標準 BMP 核心格式,包含:位圖資訊頭、調色板、影像資料三部分。

  1. 透過 GetObject 取得 BITMAP 結構,填寫 BITMAPINFOHEADER,計算調色板大小,配置全域記憶體(GlobalAlloc)。
  2. 修正影像資料寬度為 4 位元組對齊(biSizeImage 計算),重新調整記憶體大小(GlobalReAlloc)。
  3. 呼叫 GetDIBits 將資訊頭、調色板、像素資料寫入記憶體區,取得 DIB 控制代碼(HANDLE),即可構成標準 BMP 檔案。

三、螢幕資料傳輸控制機制

3.1 連線確認協議

客戶端發送固定標識 "CopyScr",伺服器端回應相同標識,雙方確認連線有效。程式碼片段:

char cFlag[8] = "CopyScr\0";
send(sktClient, cFlag, 8, 0); // 發送客戶端標識
recv(sktClient, cFlag, 8, 0); // 接收伺服器端標識

3.2 伺服器端定時分塊傳送

客戶端以固定計時器間隔請求畫面。伺服器端流程:

  1. 擷取螢幕 → 轉 DIB。
  2. 先傳送畫面資訊結構(尺寸、長度等)。
  3. 以固定區塊大小(SENDBLOCK)分批發送 DIB 資料,每塊發送後等待客戶端確認(recv StopFlag)。
  4. 處理不足一塊的剩餘資料。

3.3 客戶端拼接與顯示

客戶端按相同分塊邏輯接收:先讀畫面資訊,再循環接收區塊資料,最後接收餘數。完整組裝後,呼叫 StretchDIBits 直接繪製到客戶端 DC 上,實現畫面即時顯示。

3.4 滑鼠事件回傳與模擬

使用者在客戶端畫面區域點擊滑鼠,客戶端封裝按鍵類型(左/右)、點擊模式(單/雙擊)、座標(X/Y)等事件傳送給伺服器端。伺服器端解析後呼叫 mouse_event(如 MOUSEEVENTF_LEFTDOWN)模擬輸入,完成遠端操控閉環。

結語與應用驗證

透過上述機制,客戶端可定時接收伺服器端畫面,伺服器端即時響應滑鼠事件,實現本地端對目標機的完整遠端控制。該技術已成功應用於電子測量儀器的遠端監控系統中,驗證了其穩定性與實用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved