Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155880
  • 博文数量: 41
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 10:16
文章分类
文章存档

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-07-31 16:19:33

tcp.c文件的tcp_find_established函数

978计划工作组 2009-7-31

1函数源码

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;

}

2函数用途

查找侦听队列中完成连接的节点,也就是完成了3次握手的节点。此函数供tcp_dequeue_established函数使用。

3语句注释

3.1 struct sk_buff *p=skb_peek(&s->receive_queue);

s侦听套接字的sock结构

s->receive_queuestruct sk_buff结构体的实例,是一个双向循环链表,连接的第1次握手时在尾部增加一个链表节点,当第3次握手完成将此节点删除。

skb_peek:返回指向链表第一个节点的指针。

struct sk_buff *pp指向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->statesock的状态。

3.3 while(p!=(struct sk_buff *)&s->receive_queue);

p当前节点。

(struct sk_buff *)&s->receive_queue):链表的头节点。

while:当链表循环一周则结束。

阅读(1509) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~