全部博文(41)
分类: LINUX
2009-08-04 15:59:25
tcp.c文件的tcp_close_pending函数
978计划工作组
/*
* This routine closes sockets which have been at least partially
* opened, but not yet accepted. Currently it is only called by
* tcp_close, and timeout mirrors the value there.
*/
static void tcp_close_pending (struct sock *sk)
{
struct sk_buff *skb;
while ((skb = skb_dequeue(&sk->receive_queue)) != NULL)
{
skb->sk->dead=1;
tcp_close(skb->sk, 0);
kfree_skb(skb, FREE_READ);
}
return;
}
关闭已经至少完成了第1次握手但是还没完成第3次握手的套接字。
sk:侦听套接字的sock结构
&sk->receive_queue:sk_buff的链表头地址;此链表是一个双向循环链表,用于存储至少完成了第1次握手但是没有完成第3次握手的socket的相关信息。
skb_dequeue:删除链表的某节点并返回次节点;此节点仅仅是脱离了链表并未实际的释放内存。
while:知道整个链表的节点都删除完毕为止。
skb->sk->dead:等于1表示该sock结构已处于释放状态。
0:立即清空接收队列。
tcp_close:释放之前创建的用于本地通信的套接字。
FREE_READ:表示调用struct proto 结构的rfree函数。
kfree_skb:释放缓存的请求数据包。