空闲断开
当客户端够多的时候,服务器的压力很大。客户端连接进行一些短时的操作,操作完成之后,空闲时间达到一定的程度,就会断开。如何实现这个功能???
- 控制连接的空闲断开
通过安装一个闹铃信号来实现。
查看信号命令:
kill -l
设置闹钟的函数:
void start_cmdio_alarm(void)
{
if(tunable_idle_session_timeout != 0)
{
signal(SIGALRM, handle_alarm_timeout); //安装闹钟信号
alarm(tunable_idle_session_timeout);
}
}
在ftppro中接收客户端命令的语句之前,
收到闹钟信号之后的处理函数:
void handle_alarm_timeout(int sig)
{
ftp_reply(p_sess, FTP_IDLE_TIMEOUT, "Timeout.");
close(p_sess->ctrl_fd);
exit(EXIT_SUCCESS);
}
首先是安装信号SIGALRM,并启动定时闹钟。如果在闹钟到来之前没有收到任何命令,则在SIGALRM信号处理程序中关闭控制连接,并给客户421Timeout的响应,并且退出会话。
- 数据连接的空闲断开
如果当前处于数据传输的状态,那么即使控制连接通道空闲(在空闲时间内没有收到任何客户端的命令),也不应该退出会话。实现方法,只需要将先前设定的闹钟关闭即可。数据连接通道建立了,但是在一定的时间没有传输数据,那么应该将整个会话断开
在传输数据之前安装信号SIGALRM,并启动闹钟。在传输数据过程中,如果收到SIGALRM信号
如果sess->data_process = 0,则给客户端超时的响应421Data timeout. Reconnect Sorry, 并且退出会话。
如果sess->data_proces=1,将sess->data_process=0,重新安装信号SIGALRM,并启动闹钟。
这个设置闹钟信号的函需要设置在获取数据连接的函数中。
void handle_sigalrm(int sig)
{
if (!p_sess->data_process)
{
ftp_reply(p_sess, FTP_DATA_TIMEOUT, "Data timeout. Reconnect. Sorry.");
exit(EXIT_FAILURE);
}
// 否则,当前处于数据传输的状态收到了超时信号
p_sess->data_process = 0;
start_data_alarm();
}
void start_data_alarm(void)
{
//设置了数据连接超时限制则用数据连接限制的闹钟覆盖原来的闹钟(控制连接限制闹钟)
if(tunable_data_connection_timeout != 0)
{
signal(SIGALRM, handle_sigalrm);
alarm(tunable_data_connection_timeout);
}
//否则就人为的将控制连接限制的闹钟取消
else if(tunable_idle_session_timeout != 0)
{
alarm(0);
}
}
PS:这个控制连接的空闲断开很好理解,可是数据连接的空闲断开有些难。