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

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://os.chinaunix.net/a2009/0825/997/000000997333.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值