远程控制技术在远程设备(软件)的维护、监控与故障诊断等方面有广泛的应用前景,且大 都使用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));