基于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