freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于linux的遠程控制技術(shù)客戶端的實現(xiàn)—論文(編輯修改稿)

2025-01-09 00:59 本頁面
 

【文章內(nèi)容簡介】 e)。 perror(: FindFreeTcpPort: socket)。 Return 0。 } For (port = TUNNEL_PORT_OFFSET + 99。 port TUNNEL_PORT_OFFSET。 port) { = htons((unsigned short)port)。 If (bind (sock, (struct sockaddr *)amp。addr, sizeof(addr)) == 0) { Close (sock)。 Return port。 } } Close (sock)。 Return 0。 } int //監(jiān)聽 TCP端口 ListenAtTcpPort(int port) { int sock。 struct sockaddr_in addr。 int one = 1。 = AF_INET。 = htons(port)。 = INADDR_ANY。 Sock = socket (AF_INET, SOCK_STREAM, 0)。 If (sock 0) { fprintf(stderr,programName)。 perror(: ListenAtTcpPort: socket)。 Return 1。 } If (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (Const char *)amp。one, sizeof(one)) 0) { fprintf(stderr,programName)。 perror(: ListenAtTcpPort: setsockopt)。 Close (sock)。 Return 1。 } If (bind (sock, (struct sockaddr *)amp。addr, sizeof(addr)) 0) { fprintf(stderr,programName)。 perror(: ListenAtTcpPort: bind)。 Close (sock)。 Return 1。 } If (listen (sock, 5) 0) { fprintf(stderr,programName)。 perror(: ListenAtTcpPort: listen)。 Close (sock)。 Return 1。 } Return sock。 } int //接受 TCP連接 AcceptTcpConnection(int listenSock) { int sock。 struct sockaddr_in addr。 int addrlen = sizeof(addr)。 int one = 1。 Sock = accept (listenSock, (struct sockaddr *) amp。addr, amp。addrlen)。 If (sock 0) { fprintf(stderr,programName)。 perror(: AcceptTcpConnection: accept)。 Return 1。 } If (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (Char *)amp。one, sizeof(one)) 0) { fprintf(stderr,programName)。 perror(: AcceptTcpConnection: setsockopt)。 Close (sock)。 Return 1。 } Return sock。 } Bool //根據(jù)命令行參數(shù)提供的服務(wù)器主機名,取得服務(wù)器的地址 StringToIPAddr(const char *str, unsigned int *addr) { struct hostent *hp。 If (strcmp(str,) == 0) { *addr = 0。 /* local */ Return True。 } *addr = i_addr(str)。 If (*addr != 1) Return True。 hp = gethostbyname(str)。 If (hp) { *addr = *(unsigned int *) hph_addr。 Return True。 } Return False。 } 客戶端對服務(wù)器端的屏幕控制 客戶端實現(xiàn)的屏幕控制原理: 1) 屏幕控制 VNC 是把被控制端的屏幕做成圖像,經(jīng)過壓縮后傳送到控制端,控制端的控制信息(如鼠標信息)傳送到被控制端后進入消息隊列。如圖 7所示。 客 戶 端V n c v i e w e r應(yīng) 用 程 序V n c s e r v e ra p p l i c a t i o n sX 服 務(wù) 器( v n c p r o t o c a l ) 圖 7 屏幕控制流程 其控制是基于 TCP/IP 的, VNC 協(xié)議是基于 RFB 協(xié)議的。 RFB( remote frame buffer)是一個定義遠程圖形用戶終端接口的簡單協(xié)議。因為它是以 frame buffer 級別的工作方式,實用于所有的窗口系統(tǒng)。用戶所操作的遠程終端(包括一個顯示器、鍵盤和鼠標等)被稱為 RFB 客戶端。遠程終端所引起的 frame buffer 變化可以通知到 RFB 服務(wù)器。 2) 截屏方式 VNC 使用的截屏方式有兩種,一種是使用自動報告需要截屏的區(qū)域,第二種是某個區(qū)域截屏后使用某種壓縮算法壓縮后發(fā)送。 3) 傳輸方式 RFB 協(xié)議傳輸:在控制端不能 直接改變顯示大小,只能進行縮放,如縮放為原大小的幾倍。原理是在遠程機器上運行一個額外的 X服務(wù)器, X 服務(wù)器和客戶機器都在遠程。然后通過 RFB 協(xié)議用自己的客戶端顯示到本地。 VNC Client 通過 TCP/IP 上的 VNC 協(xié)議與 VNC Server 溝通,通過認證后,把桌面環(huán)境、輸入設(shè)備和 X資源交給 VNC Server 掌控, VNC Server 再將桌面環(huán)境通過 VNC 協(xié)議送給 VNC Client 端,讓 VNC Client 來操縱 VNC Server 桌面環(huán) 境和輸入設(shè)備。因此, RFB 協(xié)議包 中的文件就比較多,實現(xiàn)的功能也比較 復(fù)雜,包括連接的實現(xiàn)、消息的讀取和識別驗證、編碼和進制的常量聲明、用戶密碼等。 RFB 協(xié)議分為三個階段: a) 握手階段 協(xié)商安全機制,其主要代碼如下: static int//選擇安全連接類型 SelectSecurityType(void) {CARD8 nSecTypes。 Char *secTypeNames[] = {None, VncAuth}。 CARD8 knownSecTypes[] = {rfbSecTypeNone, rfbSecTypeVncAuth}。 int nKnownSecTypes = sizeof(knownSecTypes)。 CARD8 *secTypes。 CARD8 secType = rfbSecTypeInvalid。 int i, j。 If (!ReadFromRFBServer((char *)amp。nSecTypes, sizeof(nSecTypes))) Return rfbSecTypeInvalid。 If (nSecTypes == 0) { ReadConnFailedReason()。 Return rfbSecTypeInvalid。 } b) 初始化階段 客戶端發(fā)送 ClientInit,服務(wù)端桌面的共享方式。服務(wù)端發(fā)送 ServerInit 的應(yīng)答,發(fā)送自己 FramBuffer 的寬,高;發(fā)送像素的表示格式(像素表示是真彩色表示法);發(fā)送客戶端分配的名字的長度。其主要代碼如下: Bool //客戶端發(fā)送 ClientInit InitialiseRFBConnection(void) { int server_major, server_minor。 rfbClientInitMsg ci。 int secType。 If (listenSpecified) errorMessageOnReadFailure = False。 InitCapabilities()。 If (!SetupTunneling()) Return False。 If (!PerformAuthenticationTight()) Return False。 Break。 = ( ? 1 : 0)。 If (!WriteExact(rfbsock, (char *)amp。ci, sz_rfbClientInitMsg)) Return False。 If (!ReadFromRFBServer((char *)amp。si, sz_rfbServerInitMsg)) Return False。 //服務(wù)端發(fā)送 ServerInit 的應(yīng)答 = Swap16IfLE ()。 = Swap16IfLE ()。 = Swap16IfLE ()。 = Swap16IfLE ()。 = Swap16IfLE ()。 = Swap32IfLE ()。 c) 自由通信階段 C?S 通信類型有: SetRixelFormat,如果客戶端不發(fā)送這個消息,則它們之間用 ServerInit 時商定的像素格式; SetEncodings,如果客戶端不進行編碼的設(shè)定,服務(wù)端用 raw encoding 方式傳數(shù)據(jù); FramebufferUpdateRequest,客戶端根據(jù)自己的能力不斷的發(fā)送刷新請求,當服務(wù) 器端屏幕有更新時,會把有像素改變的區(qū)域回應(yīng)給客戶端; KeyEvent,發(fā)送密鑰事件; PointerEvent,發(fā)送指針事件; ClientCutText,發(fā)送客戶文本等。通信階段主要函數(shù)如表 3。 表 3 通信階段主要函數(shù) SetRixelFormat() 發(fā)送像素格式 SetEncodings() 進行編碼設(shè)定 FramebufferUpdateRequest() 發(fā)送刷新請求 KeyEvent() 發(fā)送密鑰事件 PointerEvent() 發(fā)送指針事件 ClientCutText() 發(fā)送客戶文本 其主要代碼如下: Bool //發(fā)送像素格式;進行編碼設(shè)定 SetFormatAndEncodings() {RfbSetPixelFormatMsg spf。 Char buf[sz_rfbSetEncodingsMsg + MAX_ENCODINGS * 4]。 rfbSetEncodingsMsg *se = (rfbSetEncodingsMsg *)buf。 CARD32 *encs = (CARD32 *)(amp。buf[sz_rfbSetEncodingsMsg])。 int len = 0。 Bool requestCompressLevel = False。 Bool requestQualityLevel = False。 Bool requestLastRectEncoding = False。 = rfbSetPixelFormat。 = myFormat。 = Swap16IfLE()。 = Swap16IfLE()。 = Swap16IfLE()。 If (!WriteExact(rfbsock, (char *)amp。spf, sz_rfbSetPixelFormatMsg)) Return False。 Setype = rfbSetEncodings。 SenEncodings = 0。 If () { Char *encStr = 。 int encStrLen。 Do { Char *nextEncStr = strchr(encStr, 39。 39。)。 If (nextEncStr) { encStrLen = nextEncStr encStr。 nextEncStr++。 } else { encStrLen = strlen(encStr)。 } if (strncasecmp(encSt
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1