前言
在前面的 vsftpd 登录过程的调试, vsftpd 的主动模式和被动模式 中提到了一些 vsftpd 的多进程之间的交互方式
是通过 socket 来进行通讯的, 呵呵 我们这里 大致的来看一下 相关的业务处理
基于 socket 的通讯
以 vsf_two_process_start 为例, 我们看一下 是怎么基于 socket 进行通讯的
priv_sock_init 里面初始化了两个 fd, parent_id, child_fd, 用于 之后的父子进程进行通讯
然后之后 父子进程 分别清理了一下自己不关心的另外的一个 fd, priv_sock_set_parent_context, priv_sock_set_cihld_context
从程序上来说, 只要一方持有一个 fd 两者就可以进行通讯了

priv_sock_init 里面, 创建了一对 socket, 分别放到了 session->parent_fd, session->child_fd

清理掉自己不关心的另外一个 fd

vsf_two_process_start fork 的父子进程通讯
这里是在 登录的时候, 用户录入了 用户名 + 密码之后, 子进程吧 把 用户名 + 密码 + 其他选项, 带上发送给 父进程, 请父进程验证, 以及走后面的流程
子进程这里, 没有使用 ssl 的情况, 如果验证通过了 进程就退出了了

父进程这里, 拿到用户名密码之后 走校验的处理, 校验通过 进入下一个阶段用户的相关业务交互

common_do_login fork 的父子进程的通讯
这边的 就主要是 一些业务上的处理了
如下是 common_do_login 的 fork 出来的子进程的相关业务处理, 主要包含了如下业务, 至于调用的, 可以参照 vsftpd 登录过程的调试, vsftpd 的主动模式和被动模式
1. PRIV_SOCK_CHOWN : 匿名用户上传的文件的 owner 的更新
2. PRIV_SOCK_GET_DATA_SOCK : 主动连接给定的远程的 主机 + 端口, 返回 socket_fd
3. PRIV_SOCK_PASV_CLEANUP : 一些主动模式,被动模式设计的业务处理之前, 之后清理掉 pasv_listen_fd, 比如 PASV, PORT, EPRT 处理之前, RETR, LIST, 上传 命令之后
4. PRIV_SOCK_PASV_ACTIVE : 判断当前是否处于被动模式下面, PASV 命令会发送 PRIV_SOCK_PASV_LISTEN 会监听一个端口, 如果 pasv_listen_fd 合法, 则表示处于 被动模式
5. PRIV_SOCK_PASV_LISTEN : 被动模式下, 客户端发送 PASV 命令过来, 服务器需要监听一个端口, 然后告知客户端来连接
6. PRIV_SOCK_PASV_ACCEPT : 被动模式下, 客户端来连接服务端监听的这个端口, 获取 socket, 然后进行交互

vsftpd 的主动模式和被动模式 里面的 "但是 被动模式这边, 服务端创建数据服务在某个端口监听, 这个流程上面是一笔带过的, 这时候就需要 抽象的去思考 或者 你自己去了解了, 客户端连接服务端的数据端口, 这个是在代码中有很明显的体现的 "
其中被动模式这边 服务端创建服务在某个端口监听, 是可以通过 上面的 PRIV_SOCK_PASV_LISTEN, PRIV_SOCK_PASV_ACCEPT 来学习了解的
也可以参照 vsftpd 的对于 控制端口 的监听, 以及业务处理进行了解
完
参考
1029

被折叠的 条评论
为什么被折叠?



