全部博文(41)
分类: LINUX
2009-08-25 10:56:59
tcp.c文件的tcp_listen_select函数
978计划工作组
/*
* 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;
}
用于判断监听套接字接收队列中是否有已经与远端通信端完成建立的套接字存在。
sk:侦听套接字。
sel_type:探测类型。
SEL_IN:宏值为1,探测是否有数据可读取,相关宏还有SEL_EX和SEL_OUT。
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》。
select_wait:将当前执行进程插入到master_select_eakeup队列的头部。
master_select_wakeup:等待对列或称休眠对列,是wait_queue结构指针类型。
wait:select_table_struct类型,select_wait函数通过wait获得当前进程的信息。