全部博文(41)
分类: LINUX
2009-07-31 16:19:33
tcp.c文件的tcp_find_established函数
978计划工作组
static struct sk_buff *tcp_find_established(struct sock *s)
{
struct sk_buff *p=skb_peek(&s->receive_queue);
if(p==NULL)
return NULL;
do
{
if(p->sk->state == TCP_ESTABLISHED || p->sk->state >= TCP_FIN_WAIT1)
return p;
p=p->next;
}
while(p!=(struct sk_buff *)&s->receive_queue);
return NULL;
}
查找侦听队列中完成连接的节点,也就是完成了3次握手的节点。此函数供tcp_dequeue_established函数使用。
s:侦听套接字的sock结构
s->receive_queue:struct sk_buff结构体的实例,是一个双向循环链表,连接的第1次握手时在尾部增加一个链表节点,当第3次握手完成将此节点删除。
skb_peek:返回指向链表第一个节点的指针。
struct sk_buff *p:p指向s->receive_queue的第一个节点。
skb:是sk_buff的缩写。
3.2 if(p->sk->state == TCP_ESTABLISHED || p->sk->state >= TCP_FIN_WAIT1)
return p;
TCP_ESTABLISHED:第3次握手完成时的状态,双方可以进行通信的状态。
TCP_FIN_WAIT1:本地发送FIN(用于结束连接的)数据包后即进入该状态,等待对方的应答。一般一端发送完其所要发送的数据后,即可发送FIN 数据包,此时发送通道被关闭,但仍可以继续接收远端发送的数据包。在接收到远端发送的对于FIN 数据包的应答后,将进入TCP_FIN_WAIT_2 状态
p->sk->state:sock的状态。
3.3 while(p!=(struct sk_buff *)&s->receive_queue);
p:当前节点。
(struct sk_buff *)&s->receive_queue):链表的头节点。
while:当链表循环一周则结束。