(P12)miniftpd项目实战12:内部进程间通信模块设计

1.内部进程间通信模块设计

  • 具体内容,请看第3章系统设计中:3.5内部进程间通信模块设计

  • 其他补充说明,为什么要这样做?接着上一节的写好的代码
    当前nobody进程与jjl进程之间没有通信,当jjl进程结束的时候,nobody进程没有办法结束
    在这里插入图片描述
    现在将客户端断开,那么会话就没有存在的价值,按道理nobody进程和ftp服务进程jjl都不应该存在
    在这里插入图片描述
    但是却发现ftp进程处于僵死的状态,nobody进程没有结束
    在这里插入图片描述

  • // FTP服务进程向nobody进程请求的命令

#define PRIV_SOCK_GET_DATA_SOCK 1,获取主动模式数据连接socket
ftp服务进程不能直接创建数据连接通道,应该让nobody进程来完成这个任务。

步骤如下:
FTP服务进程接收PORT h1,h2,h3,h4,p1,p2;
FTP服务进程要解析出客户端的ip,port

FTP服务进程向nobody进程发送一个PRIV_SOCK_GET_DATA_SOCK命令,让他来完成创建数据连接通道的任务;
FTP服务进程还要向nobody进程发送一个整数port 发送4个字节(虽然port是2个字节)
FTP服务进程还要向nobody进程发送一个字符串ip 长度不定长

nobody进程接收PRIV_SOCK_GET_DATA_SOCK 这条命令创建一个主动模式的socket,
还要进一步接收一个整数,即port
还要进一步接收一个字符串,即ip
操作为:
创建一个fd = socket,bind(20端口号),connect(客户端的ip和port)
连接创建完毕后,需要给客户端一个应答,成功给一个OK应答,如果是成功应答,还需要通多send_fd方法将该fd发送给ftp服务进程

-// nobody进程对FTP服务进程的应答

#define PRIV_SOCK_RESULT_OK 1
如果是成功应答,还可能有进一步的数据传输,成功应答后,还要将fd传递给ftp服务进程(因为nobody进程会获取数据socket,该socket要给ftp服务进程)

  • eg:
    miniftpd12\privsock.h
    miniftpd12\privsock.c
    miniftpd12\ftpproto.c
static void do_port(session_t *sess)需要改,目前还没改

miniftpd12\main.c

signal(SIGCHLD, SIG_IGN);//避免僵尸进程

miniftpd12\privparent.c

// 解析内部命令
// 处理内部命令
static void privop_pasv_get_data_sock(session_t *sess)
static void privop_pasv_active(session_t *sess)
static void privop_pasv_listen(session_t *sess)
static void privop_pasv_accept(session_t *sess)

其他文件变化不大

  • 测试:
    为什么nobody进程跟着结束了?
    首先客户端断开了连接,ftp服务进程readline返回为0,那么ftp服务进程也就跟着结束了,一旦其关闭,那么就会关闭相关的socketpair socket,那么nobody进程就会处于priv_sock_get_cmd的状态,一旦对方的socketpair socket关闭了,这边priv_sock_get_cmd会返回0,表示对方关闭,那么if (ret != sizeof(res))就会成立,所以nobody进程也会退出了
    首先打开一个client,接着关闭client
    在这里插入图片描述
    服务端的状态
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值