首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Linux内核-网络协议栈深入分析(5)-套接字的绑定、监听、连接和断开

2012-09-25 
Linux内核--网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开本文分析基于Linux Kernel 3.2.1原创作

Linux内核--网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开

本文分析基于Linux Kernel 3.2.1

原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7996528

更多请查看专栏http://blog.csdn.net/column/details/linux-kernel-net.html

作者:闫明


1、套接字的绑定

创建完套接字服务器端会在应用层使用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协议的发送和接收过程。


热点排行