基于套接字通信的远程截屏显示与控制技术

远程控制技术在远程设备(软件)的维护、监控与故障诊断等方面有广泛的应用前景,且大 都使用Client/Server模式。该结构包括连接在网络中的多台计算机,那些处理应用、请求另 一计算机服务的计算机为客户机(本地机),而响应请求并处理请求的计算机称为服务器(目标 机)。

远程控制的原理[1]是:用户连接到网络上,客户程序发送身份验证信息和与远 程主机连接的请求,远程主机的服务器端程序验证客户身份,若验证通过,就与客户建立连 接,并向用户发送验证通过和已建立连接的信息。此时用户便可以通过客户端程序向远程主 机发送要执行的指令,而服务器端程序则执行这些指令,并把键盘、鼠标和屏幕刷新传给客 户端程序,客户端程序通过处理把主机屏幕等信息进行显示,使用户就像亲自在远程主机上 操作一样。这种方式称为基于远程服务的远程控制(Remote Control over Remote Service) 。

综上所述,实现客户端对服务端的远程控制,需要就解决双机Socket网络通信、远 程截取屏幕显示以及屏幕数据传送控制等3个问题进行讨论。

1 双机Socket网络通信 [2]

初始化服务端Socket:在调用Socket前先要初始化,即加载相应版本的DLL,通过 调用WSAStartup函数,将加载成功的Socket库版本的相关信息填在LPWSADATA结构中;

WSADATA lpWSAData;

WSAStartup(MAKEWORD(1,1),&lpWSAData);

创建服务端Socket:完成初始化之后,调用socket函数创建一个套接字,返回套接字句柄, 在其后通信中始终用来标识套接字,若调用失败则返回INVALID_SOCKET;

SOCKET sktConnect=socket(AF_INET,SOCK_STREAM,0);

绑定服务端地址:在为某种特定协议 创建了套接字后,就用bind函数将套接字绑定到一个本机地址,其类型是sockaddr,用于指 明套接字绑定地址,包括IP地址与端口号;

bind(sktConnect,(struct sockaddr far *)&sockaddrin,sizeof(sockaddrin));

服务端监听网络:socket利用listen函数 设置状态位,用来检测是否有到来的连接请求,然后调用accept函数,准备接收客户端连接 信号,无连接请求时,服务进程被阻塞;

listen (sktConnect,1);

sktClient=accept(sktConnect,(struct sockaddr far *) &sockaddrin,& sockaddrlen);

初始化与创建客户端Winsock:首先利用 AfxSocketInit函数判断参数lpwsaData是否为空,从而确定是否调用WSAStartup函数来填充 WSADATA结构,随后同样调用socket函数创建客户端的套接字,给客户端Sockaddr_in结构赋 值,地址类型和端口号与服务端相同;

套接字选项设置:使用setsockopt函数设置套 接字选项,比如发送或者接收的超时设置,缓冲区的容量设置,使用ioctlsocket函数设置 socket的I/O模式等;

int ret=ioctlsocket(sktClient,FIONBIO,(unsigned long*) &ul);

双方建立连接:客户端调用connect函数向服务端发出连接请求,当连接请 求到来时,被阻塞服务端的accept函数生成一个新的字节流套接字,返回客户端Sockaddr_in 结构变量,用带有客户端地址的套接字与客户端进行连接,然后向客户端返回接收信号;

connect(sktClient,(const struct sockaddr *)&sockaddrin,sizeof (sockaddrin));

时间: 2024-10-28 21:49:51

基于套接字通信的远程截屏显示与控制技术的相关文章

IPC——流套接字通信

Linux进程间通信--使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程.   一.什么是socket socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计

Socket套接字通信原理

Socket套接字通信原理 Tcp/IP协议关系图     Socket在哪里?  原来Socket在这里 Socket是什么呢?        Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. TCP协议 三次握手 四次握手断开 UDP协议   问题 1.为什么握手需要3次,断开需要4

实现非阻塞套接字的一种简单方法 使用 JSSE 和 NIO 实现非阻塞通信的一种快速方法

简介: 尽管 SSL 阻塞操作――当读写数据的时候套接字的访问被阻塞――与对应的非阻塞方式相比提供了更好的 I/O 错误通知,但是非阻塞操作允许调用的线程继续运行.本文中,作者同时就客户端和服务器端描述了如何使用Java Secure Socket Extensions (JSSE) 和 Java NIO (新 I/O)库创建非阻塞的安全连接,并且介绍了创建非阻塞套接字的传统方法,以及使用JSSE 和 NIO 的一种可选的(必需的)方法. 阻塞,还是非阻塞?这就是问题所在.无论在程序员的头脑中多

Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)

上节我们实现了一个简单的多进程的服务器程序,这节,我们服务器的框架不做修改,只是将其修改为一个多线程的服务器程序. 直接上代码 server #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <errno.h> #include <netinet/in.h> #include <sys/types.h&

【网络编程6】Java与C语言套接字Socket通信的例子

继上一篇博客<Java与Python套接字Socket通信的例子>,今晚又完成了Java与C语言套接字通信过程,经过一些调试,最后成功了.Github根链接是:https://github.com/1040003585/javanettextbook/tree/master/Java_C --惠州学院13网络工程 吴成兵 20160625 目录 目录 一 特别说明 1 C语言写客户端特别说明 2 Java服务器端特别说明 21 接收数据特别说明 22 发送数据特别说明 二 操作运行 1 操作步

Linux下套接字详解(五)----基于fork多进程的TCP套接字(阻塞/同步/并发)

简介 一个简单的改进方案是在服务器端使用多线程(或多进程).多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接.具体使用多进程还是多线程,并没有一个特定的模式.传统意义上,进程的开销要远远大于线程,所以如果需要同时为较多的客户机提供服务,则不推荐使用多进程:如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全.通常,使用pthread_create ()创建新线程,fork()创建新进程

Linux进程间通信学习:如何使用流套接字

前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程. 一.什么是socket socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.

【网络编程1】Java套接字Socket

这篇博客是本人学习<Java网络程序设计>书中第4章套接字的学习总结.初学者网友学习这篇Java套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院 13网络工程 吴成兵 20160607 目录 1 目录 1 一 流套接字概述 二 服务器套接字ServerSocket 21 ServerSocket的工程过程 22 ServerSocket构造方法 23 Se

《APUE》读书笔记-第十六章网络IPC:套接字

通过网络套接字可以使得不同计算机上运行的进程相互通信. 1.创建套接字 #include <sys/socket.h> Int socket( int domain, int type, int protocol); 注意:AF_LOCAL域是AF_UNIX的别名,AF_UNSPEC域可以代表任何域. 2.套接字通信是双向的,禁止套接字上的输入/输出 #include < sys/socket.h> Int shutdown ( int sockfd, int how); 3.处理