time 
设为首页】【收藏本站
当前位置: 主页 > Unix/Linux > Linux管理 > Linux维护 > tcp.c文件的tcp_listen_select函数(14)

tcp.c文件的tcp_listen_select函数(14)

时间:2009-11-27 00:00 点击:1286次 字体:[ ]





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_EX和SEL_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结构指针类型。
wait:select_table_struct类型,select_wait函数通过wait获得当前进程的信息。





本文地址 : http://www.fengfly.com/plus/view-163977-1.html
标签: 文件 函数 数据 队列 sk wait retval
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: