劉玉寶,祝海英,張良和
(1.長春大學 軟件學院,吉林 長春 130022;2.長春職業技術學院 信息技術分院,吉林 長春 130033)
基于SOCKET技術的幾種遠程控制功能的實現
劉玉寶1,祝海英2,張良和1
(1.長春大學 軟件學院,吉林 長春 130022;2.長春職業技術學院 信息技術分院,吉林 長春 130033)
遠程控制可以作為遠程維護,遠程辦公等應用領域的支持工具。本系統采用VC++進行設計和制作,控制端與服務端連接后實現被控端的服務控制功能、進程管理功能、屏幕截取及控制功能,以便進行計算機遠程管理和維護。
遠程控制;主控端;被控端;C/S模式
遠程控制的原理很簡單:本地機直接啟動運行的主控端程序,并擁有與被控端主機使用者相同的權限。因此,如果能夠啟動服務器端的被控端程序,就可以使用相應的客戶端程序直接控制主機。也就是說,客戶端就相當于一個超級用戶,可以直接控制遠程服務端計算機。
簡單遠程控制系統由主控端和被控端兩部分組成。主控端用于實施各種對連網計算機的監控操作,被控端對于接收到的數據進行分析,解釋并執行[1],在Windows環境下即可實現。本系統采用面向連接的服務實現控制信息的傳輸。面向連接服務器處理的請求往往比較復雜,不是一來一去的請求應答所能解決的,而且往往是并發服務器。使用面向連接的套接字編程,可以通過圖1來表示。其客戶端和服務端的連接的連接過程如下:

圖1 面向連接的服務時序圖
首先,應該是客戶端的應用程序先啟動,并啟動接收數據的線程。等待接收一串數據。
服務端將數據發送給指定IP地址的客戶端。客戶端端接收到該數據后,保存該申請遠程服務的客戶端系統的信息。通過接收的SOCKET可以提取出發送請求的服務端的IP地址和開放的端口號。用頭插法將數據存儲在動態的鏈表,完成后重新進入數據接收狀態,等待其他的需要申請遠程服務的服務端主機發送數據消息。
客戶端再向服務端發送一串數據給服務端,表示客戶端將和服務端建立TCP的連接。服務端收到數據后對本機地址端口號的綁定。綁定完成后發送一串數據給客戶端,并進入監聽狀態,隨時準備建立TCP連接,并啟動一個線程來接收建立好的TCP連接后的數據信息。客戶端收到一串數據后。便初始化SOCKET的數據信息,并通過CONNECT函數建立TCP連接。系統連接成功,進入遠程控制狀態。
客戶端發送的數據是指令數據,指令數據只需要一個數字就行了。服務端接收到客戶端發來的指令數據,只需分析出其中指令數字就行了,并按指令數字代表的意義執行Windows指令管理本機系統就行了。同時將處理的數據結果發送給客戶端。客戶端收到的數據,執行指令后處理得到的數據,因此建立一個的結構體和宏指令,如圖2所示。來代表發送的指令和執行該指令后得到的數據。每次客戶端和服務端通信時都發送一個TagCommand結構體大小的數據。服務端通過wCmd來確定執行的指令,客戶端通過wCmd來確定收到的數據是關于哪方面的,對接收到的指令數據進行解析,執行指令,完成遠程控制的任務。

圖2 指令數據結構
3.1 注銷服務端系統的實現
定義一個DWORD類型的變量dwVersion;通過GetVersion()來獲得當前服務端系統的版本信息。然后執行ExitWindowsEx(EWX_LOGOFF,0)函數,實現服務端主機的注銷。
3.2 關閉服務端系統的實現
定義一個DWORD類型的變量dwVersion;通過GetVersion()來獲得當前服務端系統的版本信息。如果系統版本小于0x80000000,定義一個HANDLE類型的變量hToken,定義一個TOKEN_PRIVILEGES類型的變量tkp。否則執行
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0)函數。
3.3 重啟服務端系統的實現
定義一個DWORD類型的變量dwVersion;通過GetVersion()來獲得當前服務端系統的版本信息。如果系統版本小于0x80000000。否則執行ExitWindowsEx(EWX_FORCE|EWX_REBOOT,0)函數。
3.4 鎖定/解鎖服務端系統鼠標的實現
定義一個CPoint類型的變量pt,用GetCursorPos(&pt)獲取當前服務端系統中鼠標的位子[3],用SetCur-sorPos(pt.x,pt.y)來重置鼠標在服務端桌面上的位置,定義一個CRect類型的r變量。將該矩形的左上角位置設置為鼠標的X坐標值,右下角位置設置為鼠標的Y坐標值。其實該矩形框就是一個點的位置值。再通過調用ClipCursor(&r);函數,限制鼠標只能在該區域活動。即實現了鼠標的鎖定。通過調用系統的函數并將當前鼠標活動區域限制設置為NULL,即可實現釋放鼠標的功能。
4.1 服務端進程獲取
首先通過循環結構查找確定在系統中運行的進程的數量,然后通過調用自定義函數來打開訪問服務端系統進程的訪問權限,獲得進程訪問令牌句柄,再取得DEBUG權限的LUID,根據參數,打開或關閉相應權限,再調整權限,最后關閉句柄[2]。訪問系統運行進程權限打開后,便可通過已知的進程數量,用循環通過訪問進程的PID來獲取一個進程的信息,在每個for循環將該進程的數據信息發送給客戶端。
客戶端收到一串指令數據后,將其放在全局變量中,通過分析接收到的數據。如果是一個進程的數據信息,就提取這串數據中的進程數據信息,將該進程數據信息用頭插法將其插入到客戶端中獲取的服務端的進程鏈表中,同時顯示在客戶端界面上。
服務端通過獲得的進程的數量循環地發送每個進程的信息,客戶端不斷的接收進程的數據信息,并將其動態保存。便完成了服務端進程的獲取。
4.2 終止服務端的進程
服務端接收到終止進程控制數據后,分析出指令如果是KILLPROCESS,便循環查找出該PID的進程。打開該進程的訪問入口,然后終止該進程,關閉進程的訪問句柄。
為了保證信息傳輸的穩定,在客戶端和服務端都重新各自建立一個進程,來監聽和處理屏幕控制所需要的數據。而新建立的TCP連接,是在原TCP連接的端口號加1,連接雙方的IP地址不變。為此在客戶端和服務端都新建了兩個socket類型的變量,和SOCKADDR_IN類型的變量。來保證通信的質量。通過位圖的數據結構如圖3所示對位圖數據進行分析和處理。

圖3 位圖數據結構圖
先獲取當前桌面的HWND,然后在通過這個HWND獲取當前窗口的HDC,調用GetWindowRect(hwnd,&rc);函數獲取當前窗口的大小,最后用HBITMAP類型的變量hbmp賦值::CreateCompatibleBitmap(hsrc,570,428);畫出桌面的圖像,再來設置圖像數據的信息[4]。由此而得到了服務端系統桌面圖像的位圖。用bitmap.Attach(hbmp);加載位圖的句柄來實現對桌面位圖數據的訪問,再將屏幕圖像的發送給客戶端。通過該位圖的句柄來訪問位圖的屬性,結構大小,像素。完成屏幕圖片頭信息的保存,然后將位圖顏色表的信息拷貝到位圖指針的數據區中,完成位圖顏色信息的保存,最后將每個像素值的數據保存[5]。完成上述數據的保存后,便將三個位圖信息依次發送給客戶端,每發送一次延時0.1秒,這是為了防止客戶端接收到數據發生阻塞而不能完整的接收一個圖片的信息。
客戶端接收到服務端發來的數據后依次存放。其中需要根據圖像的信息來計算圖像的像素數據所需要的空間,然后動態的開辟所需大小的空間。將位圖的像素信息保存在該區域內。再分析接收到的位圖的數據信息,并將其顯示在客戶端顯示區域里。
系統實現了網絡中數據信息的傳輸和對系統的基本的遠程控制。通過調用Windows API編程、利用TCP/IP協議、采用C/S模型實現了幾種遠程控制功能。系統的架構和設計到最后實現,采用宏定義作為指令信息進行傳輸和控制,系統實現中涉及到,動態鏈表,多級指針,遞歸查找的算法……以及整個遠程控制系統的架構都為以后進一步的研究遠程控制提供了一定的思路和借鑒意義。但是仍然存在許多需要改進的地方,入系統運行效率不高;只能實現局域網內的遠程控制,還不能實現跨網的遠程控制,需要更進一步改進和完善。
[1] 梁洋洋.Visual C++黑客編程揭秘與防范[M].北京:人民郵電出版社,2009.
[2] 張友生.遠程控制編程技術[M].北京:電子工業出版社,2002.
[3] 求是科技.Visual C++程序設計與開發技術大全[M].北京:人民郵電出版社,2005.
[4] 謝鳳英,趙丹培,姜志國.Visual C++數字圖像處理[M].北京:電子工業出版社,2008.
[5] Stanley B.Lippman,Josee Lajoie著,潘愛民,張麗譯.C++Primer[M].北京:中國電力出版社,2006.
責任編輯:吳旭云
The implementation of some remote control functions based on SOCKET technology
LIU Yu-bao1,ZHU Hai-ying2,ZHANG Liang-he1
(1.Software College,Changchun University,Changchun 130022,China; 2.School of Information Technology,Changchun Vocational Institute of Technology,Changchun 130033,China)
Remote control system can be used as a supporting tool for remote maintenance and remote office,which uses VC++to design and program.It realizes the functions of service control,process management,screen capture and control by connecting client and control terminal so as to achieve remote management and maintenance.
remote control;master control;passive control;C/S model
TP311.1
A
1009-39072010)08-0084-04
2010-06-21
劉玉寶(1975-),男,吉林榆樹人,講師,博士研究生,主要從事嵌入式系統,智能控制,軟件工程等方面的研究。