Linux内核--网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
本文分析基于Linux Kernel 3.2.1
原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7996528
更多请查看专栏http://blog.csdn.net/column/details/linux-kernel-net.html
作者:闫明
创建完套接字服务器端会在应用层使用bind函数惊醒套接字的绑定,这时会产生系统调用,sys_bind内核函数进行套接字。
系统调用函数的具体实现
int inet_shutdown(struct socket *sock, int how){struct sock *sk = sock->sk;int err = 0;.................lock_sock(sk);if (sock->state == SS_CONNECTING) {if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_CLOSE))sock->state = SS_DISCONNECTING;elsesock->state = SS_CONNECTED;}switch (sk->sk_state) {case TCP_CLOSE:err = -ENOTCONN;default:sk->sk_shutdown |= how;if (sk->sk_prot->shutdown)sk->sk_prot->shutdown(sk, how);//调用tcp_shutdown强制关闭连接break;/* Remaining two branches are temporary solution for missing * close() in multithreaded environment. It is _not_ a good idea, * but we have no choice until close() is repaired at VFS level. */case TCP_LISTEN:if (!(how & RCV_SHUTDOWN))break;/* Fall through */case TCP_SYN_SENT:err = sk->sk_prot->disconnect(sk, O_NONBLOCK);//调用tcp_disconnect断开连接sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;//设置套接字状态break;}sk->sk_state_change(sk);release_sock(sk);return err;}后面会详细分析TCP协议的发送和接收过程。