承接上期学习小结三

https://blog.csdn.net/qq_38781075/article/details/107105041

这次依旧是以SSH为例讲述user线程,随着看的深入,学习小结二的图有了一些变化(SSH)

https://blog.csdn.net/qq_38781075/article/details/106994385

guacamole学习小结(四)

我们看下整体结构有什么新的变化,guacd有变化,前面的部分没有变化,这是SSH的。

1、user线程里面有各种的回调函数,(connection_io线程发来的)经过鼠标键盘等回调函数处理之后,就把处理后的信息发送给ssh_input线程,之后input线程又会转发给远程桌面,远程桌面处理完信息之后,又会把信息发送给ssh_client线程(实际上是ssh_client线程主动调用官方libssh库read读取的),然后ssh_client处理之后再把消息群发给各个connection_io线程(其实也就是各个用户)。

2、现在说说这些图中新增的线程是什么时候创建的,我在学习小结三中提到的join_handler回调函数,每个新增的用户都会调用一次,这个join_handler创建了ssh_client线程,而ssh_client线程又创建ssh_input线程。

3、之前学习小结提到的guac_client_init函数,它的初始化并未涉及到官方的libssh库调用,只是绑定了一些回调函数之类的,这个初始化和我接下来讲的初始化不一样。ssh_client线程创建之后才是真真正正的调用了libssh库,如libssh2_init函数,这个不是guacamole写的函数,关于调用libssh库可以参考一篇文章:https://blog.csdn.net/my2005lb/article/details/47416731

4、ssh_client线程创建之后调用了官方库才是SSH客户端的真正初始化(学习小结二提到的库是guacamole自己的二次封装的库),ssh_client线程接收(主动read读取,libssh2_channel_read函数)来自远程桌面的数据,进行处理(包括转换成Guacamole协议、渲染)之后转发给connection_io线程。

5、ssh_input线程接收来自user线程处理好的数据转发给远程桌面(纯粹的转发线程跟connection_io线程类似)。

6、图中新增的两个线程(ssh_input线程、ssh_client线程)均为远程桌面拥有者创造,也就是第一个访问用户。

7、user线程跟ssh_input线程通信使用匿名管道,ssh_input线程与远程桌面通信为SSH协议,远程桌面与ssh_client线程通信为SSH协议,ssh_client与connection_io线程群发用socketpair通信,值得一提的是,群发其实就是一个一个的发,所有加入的用户的socketpair的fd都会放在一个链表里,就可以一个一个发了。

相关文章: