监听连接请求

sys_listen 函数执行监听任务,传递的两个参数分别是socket的文件号和连接数。

/*
 *	Perform a listen. Basically, we allow the protocol to do anything
 *	necessary for a listen, and if that works, we mark the socket as
 *	ready for listening.
 */

asmlinkage long sys_listen(int fd, int backlog)
{
	struct socket *sock;
	int err, fput_needed;
	int somaxconn;

	sock = sockfd_lookup_light(fd, &err, &fput_needed);
	if (sock) {
		somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
		if ((unsigned)backlog > somaxconn)
			backlog = somaxconn;

		err = security_socket_listen(sock, backlog);
		if (!err)
			err = sock->ops->listen(sock, backlog);

		fput_light(sock->file, fput_needed);
	}
	return err;
}


sys_listen() 函数找到服务器socket 以后,通过它的协议操作表结构struct proto_ops 执行其listen() 

钩子函数。 proto_ops协议操作表结构的挂入过程在前面介绍了,我们也看到服务器的sock->ops挂入

的是inet_stream_ops操作表结构,因此这里调用的是inet_stream_ops 结构的listen(), 注意参数

backlog 是限定的连接数10.



猜你喜欢

转载自blog.csdn.net/robinsongsog/article/details/79846170