Linux内核协议栈(7)listen函数分析
2016-03-27 21:05
531 查看
<pre name="code" class="cpp">
监听函数主要干了两件事:
1.建立接受队列,并为接受队列分配空间
2.将sock对象设置为监听状态,并放入监听哈希表
/* * 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. */ /* * * 就是把套接字挂到监听链表下 */ SYSCALL_DEFINE2(listen, int, fd, int, backlog) { struct socket *sock; int err, fput_needed; int somaxconn; sock = sockfd_lookup_light(fd, &err, &fput_needed);//查找sock 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);/**/inet_listen fput_light(sock->file, fput_needed); } return err; }调用链为:sys_listen-->inet_listen-->inet_csk_listen_start
int inet_csk_listen_start(struct sock *sk, const int nr_table_entries) { struct inet_sock *inet = inet_sk(sk); struct inet_connection_sock *icsk = inet_csk(sk); int rc = reqsk_queue_alloc(&icsk->icsk_accept_queue, nr_table_entries);//创建请求队列及为队列分配空间,listen_sock + nr_table_entries * request_sock if (rc != 0) return rc; sk->sk_max_ack_backlog = 0; sk->sk_ack_backlog = 0; inet_csk_delack_init(sk);//将sock中的icsk_ack置0 ---> Delayed ACK control data /* There is race window here: we announce ourselves listening, * but this transition is still not validated by get_port(). * It is OK, because this socket enters to hash table only * after validation is complete. */ /* * 要么把自己加入到tcp_hashinfo 中的ehash 中,要么加入到listening_hash 中,这要根据 * sk_state 的值来操作,如果是LISTEN,就加入后者,如果是除LISTEN 之外的值,那么就加入 * ehash 表,我们会在研究connect 的代码中看到。 */ sk->sk_state = TCP_LISTEN; if (!sk->sk_prot->get_port(sk, inet->num)) { /*获取可用端口*/inetsw_array --> tcp_prot --> inet_csk_get_port inet->sport = htons(inet->num); sk_dst_reset(sk); sk->sk_prot->hash(sk);/*------------------------>加入监听哈希表*/ inetsw_array --> tcp_prot --> __inet_hash return 0; } sk->sk_state = TCP_CLOSE; __reqsk_queue_destroy(&icsk->icsk_accept_queue); return -EADDRINUSE; }
未完待续...
相关文章推荐
- Linux磁盘及文件系统管理
- Linux磁盘及文件系统管理
- Linux下DHCP服务器配置与应用
- Linux进程管理工具top/htop/glances/dstat的使用
- Linux文件系统管理之一(文件权限管理)
- CentOS6 编译安装python 3.5
- Linux学习笔记——切换并取代用户身份命令——su
- 《Linux内核设计与实现》——第5章(系统调用)
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)
- Linux内核分析——系统调用(下)
- Linux开发环境搭建 一 (Ubuntu安装的方式,如何选择?)
- CentOS启动流程、Grub legacy配置、linux kernel模块管理、伪文件系统介绍
- Linux内核协议栈(附3)udp_lib_get_port函数
- linux下查看用户及用户组的方法
- Linux内核分析 实验五:分析system_call中断处理过程
- 笔记本安装CentOS的步骤以及安装过程中黑屏的解决办法
- linux-matlab2015b安装步骤
- Linux命令-查看用户的UID和GID
- 分布式Web应用----Linux环境下zookeeper集群环境的安装与配置
- Linux下U盘、SD卡挂载与卸载