VC++实现远程控制

Home / C++ 百晓生 2018-10-16 4465

网上搜索到的一个不错的学习例子,局域网使用正常(外网端口映射没试,如果有NAT穿透功能就舒服了)。工程包括服务器端和客户端,服务器端是RDS(Remote Desktop Server),客户端是RDV(Remote Desktop Viewer),可执行文件打包在源代码里,工程可以用于Visual Studio 2005或2008,我创建了一个脱离zlib库的自定义工程,用/MT设置编译为Windows库,包含32位和64位库文件,包含Release和Debug模式。包含了ZLIB.H和ZCONF.H文件。单线程示例的使用方法,参见CZLib类。多线程例子的使用方法,参见CDriveMultiThreadedCompression, CMultiThreadedCompression, 和 CZLib。


该系统可分为四个主要组成部分: 
1. 网络层 
2. 压缩层 
3. 图形层 
4. 输入层

网络层,CTCPSocket,依赖于OS提供的SOCKET事件,随后转发到期待这些消息的窗口中的消息泵,重载了<< 和 >> 操作符,用于发送和接收数据。数据通过CPacket类描述,每个类型的包都有构造函数。socket类是由CAsyncSocket派生。这一类依赖于网络事件,通过消息泵中继,当有感兴趣的事情发生时将通知程序。注意,发送函数是TransmitPackets,该函数将内存数据或文件数据通过连接的socket发送。TransmitPackets通过操作系统的缓冲管理器接收文件数据,在传输所需的最短时间里锁定内存,实现高效率,高性能的传输。

压缩层可以划分为两个部分,每个部分有两个分类。外面的部分是线程模型,压缩可以通过单线程或多线程完成,每个线程中可以用zlib和自定义的编码压缩器。压缩包里的数据为位图数据。我的压缩器的知识基于Jean-Loup Gailley 和Mark Nelson的书"The Data Compression Book - Second Edition" ISBN 1-55851-434-1。

图形层是多线程的另一个所用之处。最后版本的代码中该部分已经有了显著的改善,速度快了两倍多。代码主体创建一个线程,轮询屏幕每个区域是否有改变。当检测到该区域有变化,发送通知到主线程,主线程发送数据包到所有连接的客户端,每个线程有一个活动计时器,屏幕变化不频繁,区域检查的频率也相应降低。当区域发生改变,活动计时器复位,这样停滞的时间就比较短。

输入层在客户端代码里,捕捉鼠标和键盘事件并发送到服务器端。服务器端使用SendInput函数执行这些事件。


本文链接:https://www.it72.com/12409.htm

上传的附件:
推荐阅读
最新回复 (0)
返回