XRDP 源码解读

基于https://github.com/neutrinolabs/xrdp v0.9.5分支

xrdp.c
-->main
-->xrdp_listen_test //只是测试是否可以listen马上关闭
-->xrdp_listen_main_loop //启动listen主循环
xrdp_listen.c
-->xrdp_listen_main_loop
-->xrdp_listen_get_port_address //处理需要监听的端口号地址
-->trans_listen_address//创建socket 监听
--> self->listen_trans->trans_conn_in = xrdp_listen_conn_in;  //监听的socket, 注意,开始阶段是listen状态, 设置的是listen传输回调 listen_trans ->trans_conn_in
// /* Run the callback when accept() returns a new socket*/
-->(trans_check_wait_objs(self->listen_trans)  //循环 等待客户端connect然后accept   type 是 TRANS_TYPE_LISTENER
if (self->type1 == TRANS_TYPE_LISTENER) /* listening */  //监听状态
--> if (self->trans_conn_in != 0) /* is function assigned */  //发现没有, 这里就是上面设置的回调.
                    in_trans->sck = in_sck;
                     in_trans->type1 = TRANS_TYPE_SERVER;
                    in_trans->status = TRANS_STATUS_UP;
                    in_trans->is_term = self->is_term;
                    self->trans_conn_in(self, in_trans) != 0  ///获取到socket句柄,  并且把listening状态转换为server状态
-->xrdp_listen_conn_in //回调处理listening
process->server_trans = new_self; // 新的trans 对象, 因为listening转为server了, 所以启用了server_trans
g_process = process;
 
-->xrdp_process_run
process = g_process; 
xrdp_process_main_loop(process); //这里就完成了listen_trans转到了server_trans了.
 
-->xrdp_process_main_loop
-->self->server_trans->trans_data_in = xrdp_process_data_in; //传输数据处理回调设置
     self->session = libxrdp_init((tbus)self, self->server_trans); //初始化libxrdp
-->libxrdp_init
-->libxrdp_process_incoming //libxrdp库处理, 协议层数据解,  循环处理各种数据了.
-->xrdp_rdp_incoming
-->xrdp_sec_incoming
-->xrdp_iso_incoming  ///* negotiate security layer */

while //循环读取发送数据, 用的是self->server_trans, 这个是accept之后得到的.

-->if (trans_check_wait_objs(self->server_trans) != 0) //熟悉吗, 上面listening阶段也有启动一个循环, 这里的是循环读取数据了.
else /* connected server or client (2 or 3) */  //因为  in_trans->type1 = TRANS_TYPE_SERVER; 所以进入这个分支
--> else if (self->trans_can_recv(self, self->sck, 0))  // 先判断能否读数据
--> read_bytes = self->trans_recv(self, self->in_s->end, to_read); //读数据
--> if (self->trans_data_in != 0) /* is function assigned */
         rv = self->trans_data_in(self);   ///处理转为服务阶段的数据
self->trans_data_in 就是调用了 xrdp_process_data_in, //前面有初始化
 
接下来是处理数据了 xrdp_process_data_in
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值