rdesktop代码笔记
    rdesktop是一个在Linux下可以连接Windows远程桌面的rdp客户端,官网连接:http://www.rdesktop.org/。目前版本是1.7.1,貌似很久没有更新了。不过代码结构比较简单,拿来结合rdp协议分析下入门还不错。
    Rdp协议是ITU-T T.128程序共享协议的扩展,M$公开了rdp协议的实现细节,只要按照其实现客户端,就可以远程连接Windows远程桌面。目前已经有相当多的开源工程实现了rdp协议,比如rdesktop、FreeRdp等,主要都是在Linux下实现的。在Windows下可以直接利用M$的mstscax.dll控件进行开发,可以快速搞定:)。
    Rdp协议的基础文档是MS-RDPBCGR,msdn:http://msdn.microsoft.com/en-us/library/cc240445.aspx。
    rdesktop支持应用程序拉远,代码中与seamless有关的都是有关应用拉远的内容。Rdp协议中有一个静态虚拟通道(Static Virtual Channels)的概念,可以在client和server组件之间进行无损数据通信。虚拟通道数据是应用程序制定的,对于rdp协议并不是透明的。一次连接中最多可以31个虚拟通道。mstsc中的音频、录音、磁盘重定向等都是通过静态虚拟通道来实现的。

    rdesktop从main函数开始执行,首先是解析命令行参数,进行各种全局变量的设置。然后ui_init()图形界面初始化。
    接下来是虚拟通道的初始化。rdpsnd_init()对音频通道初始化,完成音频通道及本地音频设备的注册。首先调用channel_register()注册一个名为"rdpsnd"的虚拟通道和rdpsnd_process回调函数。当有rdpsnd通道数据到来的时候,就会调用rdpsnd_process回调进行处理。音频数据到的时候,有一个队列来进行接收。rdpsnd_queue_init()用来对音频接收数据队列初始化。rdpsnd_register_drivers()注册音频设备,根据设备类型来进行设备操作的回调。rdpdr_init()是对rdpdr通道初始化,包含了磁盘重定向等。
    然后是一个while循环,用来建立连接、处理rdp数据、处理窗口消息等。rdesktop_reset_state()重置状态。ui_init_connection()设置远程桌面大小等。rdp_connect()根据前面设置的参数建立连接。rdp_main_loop()通过while循环处理来的包。
    当用户断开或者由于网络错误连接断开时,继续处理断开流程。调用rdp_disconnect()断开socket,ui_destroy_window()销毁窗口。然后根据g_pending_resize判断是否要重连。因为rdp协议不支持在连接过程中更改分辨率,所以要断开重连下。


                        (To Be Continued......)
Logo

更多推荐