文章目录

  • ​​1.控制连接空闲断开​​
  • ​​2.数据连接空闲断开​​

1.控制连接空闲断开

  • (1)首先是安装信号SIGALRM,并启动定时闹钟
  • (2)如果在闹钟到来之前没有收到任何命令,则在SIGALRM信号处理程序中关闭控制连接,并给客户421 Timeout.的响应,并且退出会话。
  • vsfdtp服务器做法
    如果在5s内没有收到客户端发来的任何一条命令,那么服务端将断开与客户端之间的会话
  • (P19)miniftpd项目实战19:控制连接空闲断开,数据连接空闲断开_ftp服务器


  • (P19)miniftpd项目实战19:控制连接空闲断开,数据连接空闲断开_客户端_02

  • 5s时到了,会断开与客户端之间的连接,给客户端一个421的应答
  • (P19)miniftpd项目实战19:控制连接空闲断开,数据连接空闲断开_ftp服务器_03

  • eg:
    main.c中的全局变量
extern session_t *p_sess;

ftpproto.c

void start_cmdio_alarm(void)
void handle_alarm_timeout(int sig)
  • 测试:idle_session_timeout=10
    测试miniftp服务器10s钟是否超时

2.数据连接空闲断开

  • (1)如果当前处于数据传输的状态,那么即使控制连接通道空闲(在空闲时间内没有收到任何客户端的命令)也不应该退出会话。实现方法,只需要将先前设定的闹钟关闭掉。
  • (2)数据连接通道建立了,但是在一定时间没有传输数据,那么也应该将整个会话断开。
  • (3)大致步骤如下:
在传输数据之前安装信号SIGALRM,并启动闹钟。
在传输数据的过程中,如果收到SIGALRM信号:
如果sess->data_process = 0,则给客户端超时的响应421 Data timeout. Reconnect. Sorry.,并且退出会话。
如果sess->data_process = 1,将sess->data_process = 0; 重新安装信号SIGALRM,并启动闹钟。
  • eg:ftpproto.c
还要注意将start_data_alarm函数放的位置
void start_data_alarm(void)
void handle_sigalrm(int sig)
  • 测试:上传过程中,即使过了10s也不会断开数据连接通道