一、最大连接数的限制
概念
这是指服务器可以同时接收的最大连接数,防止服务器压力过大而在应用层进行的限制。
实现
总体思路:将当前连接数保存于变量num_clients变量中,然后与配置项numble_max_clients进行比较,如果超过了就不让登录,当一个客户登录的时候num_clents加1,当一个客户退出的时候,num_clients减1。
1.一旦服务器端与客户端经过三次握手建立连接之后,服务端就需要创建进程为其服务,此时,将连接数加1。
//来了一个新的客户端,需要创建子进程出来
++s_children;
//当前连接数等于子进程数
sess.num_clients = s_children;
2.然后在负责服务的子进程中进行最大连接数的判断
如果当前连接数超过了最大连接数,那么就要退出当前子进程。
//连接数的判定
void check_limits(session_t *sess)
{
//最大连接数配置项是否开启并且当前连接数超过了最大连接数
if (tunable_max_clients > 0 && sess->num_clients > tunable_max_clients) {
ftp_reply(sess, FTP_TOO_MANY_USERS,
"There are too many connected users, please try later.");
//退出当前子进程
exit(EXIT_FAILURE);
}
//最大连接数没有超过上限的情况下,再检查ip的连接数是否超过上限
if (tunable_max_per_ip > 0 && sess->num_this_ip > tunable_max_per_ip) {
ftp_reply(sess, FTP_IP_LIMIT,
"There are too many connections from your internet address.");
exit(EXIT_FAILURE);
}
}
3.负责服务客户端的子进程退出连接后,父进程进行后续处理。
父进程是专门用于处理客户端连接的,父进程会注册SIGC