文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>tcp.c文件的tcp_listen_select函数(14)

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

时间:2009-08-25  来源:978计划

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获得当前进程的信息。

 

相关阅读 更多 +
排行榜 更多 +
试着飞手游下载

试着飞手游下载

休闲益智 下载
血染小镇(功能菜单)中文版下载

血染小镇(功能菜单)中文版下载

飞行射击 下载
泰坦之旅高爆版下载

泰坦之旅高爆版下载

角色扮演 下载