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

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-08-25 10:56:59

tcp.c文件的tcp_listen_select函数

978计划工作组 2009-8-25

1函数源码

/*

 * LISTEN is a special case for select..

 */

static int tcp_listen_select(struct sock *sk, int sel_type, select_table *wait)

{

       if (sel_type == SEL_IN) {

              int retval;

 

              sk->inuse = 1;

              retval = (tcp_find_established(sk) != NULL);

              release_sock(sk);

              if (!retval)

                     select_wait(&master_select_wakeup,wait);

              return retval;

       }

       return 0;

}

2函数用途

用于判断监听套接字接收队列中是否有已经与远端通信端完成建立的套接字存在

3调用关系

4语句注释

4.1 static int tcp_listen_select(struct sock *sk, int sel_type, select_table *wait)

sk侦听套接字

sel_type探测类型

4.2 if (sel_type == SEL_IN) {

SEL_IN:宏值为1,探测是否有数据可读取,相关宏还有SEL_EXSEL_OUT

4.3  sk->inuse = 1;

       retval = (tcp_find_established(sk) != NULL);

       release_sock(sk);

skb->inuse:为1表示此sock结构处于忙状态

release_sock网络层模块在将一个数据包传递给传输层模块处理时(tcp_rcv),如果当前对应的套接字正忙,则将数据包插入到sock 结构back_log 队列中。但插入该队列中的数据包并不能算是被接收,该队列中的数据包需要进行一系列处理后插入receive_queue 接收队列中时,才算是完成接收。而release_sock 函数就是从back_log 中取数据包重新调用tcp_rcv 函数对数据包进行接收。所谓back_log 队列只是数据包暂居之所,不可久留,所以也就必须对这个队列中数据包尽快进行处理,那么也就表示必须对release_sock 函数进行频繁调用

tcp_find_established:参见《tcp.c文件的tcp_find_established函数(2.doc

4.4  if (!retval)

              select_wait(&master_select_wakeup,wait);

select_wait将当前执行进程插入到master_select_eakeup队列的头部

master_select_wakeup:等待对列或称休眠对列,是wait_queue结构指针类型。

waitselect_table_struct类型,select_wait函数通过wait获得当前进程的信息。

 

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