miniftp项目总结(七)

空闲断开
当客户端够多的时候,服务器的压力很大。客户端连接进行一些短时的操作,操作完成之后,空闲时间达到一定的程度,就会断开。如何实现这个功能???

  • 控制连接的空闲断开
    通过安装一个闹铃信号来实现。
    查看信号命令:
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:这个控制连接的空闲断开很好理解,可是数据连接的空闲断开有些难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值