?? 2_4網絡代碼閱讀筆(3) - china linux forum.htm
字號:
transition is still not validated by get_port(). <BR>* It is OK,
because this socket enters to hash table only <BR>* after validation
is complete. <BR>*/ <BR>>>>>更改狀態 <BR>sk->state =
TCP_LISTEN; <BR>>>>>如果沒有對端口賦值,則查找一個合適的端口,
<BR>>>>>這里調用的函數是tcp_v4_get_port,我們已經詳細分析了 <BR>if
(sk->prot->get_port(sk, sk->num) == 0) { <BR>sk->sport =
htons(sk->num);
<BR>>>>>得到sk->dst_cache的指針,然后將其置為NULL,然后將sk->dst_cache
<BR>>>>>所指的路由緩存使用計數減1 <BR>sk_dst_reset(sk);
<BR>>>>>調用tcp_v4_hash,見下面分析
<BR>sk->prot->hash(sk); <BR>return 0; <BR>} <BR>sk->state =
TCP_CLOSE; <BR>write_lock_bh(&tp->syn_wait_lock);
<BR>tp->listen_opt = NULL;
<BR>write_unlock_bh(&tp->syn_wait_lock); <BR>kfree(lopt);
<BR>return -EADDRINUSE; <BR>} <BR>tcp_v4_hash調用__tcp_v4_hash:
<BR>static __inline__ void __tcp_v4_hash(struct sock *sk) <BR>{
<BR>struct sock **skp; <BR>rwlock_t *lock;
<BR>BUG_TRAP(sk->pprev==NULL); <BR>if(sk->state == TCP_LISTEN)
{ <BR>>>>>如果是傾聽狀態,則將其鏈入到tcp_listening_hash表中,hash值根據端口
<BR>>>>>號計算. <BR>skp =
&tcp_listening_hash[tcp_sk_listen_hashfn(sk)]; <BR>lock =
&tcp_lhash_lock; <BR>tcp_listen_wlock(); <BR>} else {
<BR>>>>>否則,則將其鏈入到tcp_ehash鏈表中,什么時候會將其連接到tcp_ehash中
<BR>>>>>有待于后面的分析. <BR>skp =
&tcp_ehash[(sk->hashent = tcp_sk_hashfn(sk))].chain; <BR>lock
= &tcp_ehash[sk->hashent].lock; <BR>write_lock(lock); <BR>}
<BR>>>>>將它連到hash表的前面,如果后面還有其它的hash值相同的元素,則將這個元素的
<BR>>>>>的前向指針指向我們這個sock的next域 <BR>if((sk->next =
*skp) != NULL) <BR>(*skp)->pprev = &sk->next; <BR>*skp =
sk; <BR>>>>>我們這個sock的前向指針指向hash表頭. <BR>sk->pprev =
skp; <BR>sock_prot_inc_use(sk->prot); <BR>write_unlock(lock);
<BR>if (sk->state == TCP_LISTEN)
<BR>wake_up(&tcp_lhash_wait); <BR>} <BR><BR>到目前為止,我們已經遇到了struct
sock如下的指針: <BR><BR>第一組: <BR>/* Local port binding hash linkage. */
<BR>>>>>將綁定到相同端口的sock連接起來的指針 <BR>struct sock *bind_next;
<BR>struct sock **bind_pprev;
<BR>>>>>這個指針指向所在的tcp_bind_bucket結構 <BR>struct sock
*prev; <BR>第二組: <BR>/* Main hash linkage for various protocol lookup
tables. */ <BR>>>>>將處于同一狀態的sock連接起來的指針,例如傾聽狀態,連接建立狀態
<BR>struct sock *next; <BR>struct sock **pprev;
<BR><BR>還遇到了兩個hash表,它們是: <BR>struct tcp_hashinfo __cacheline_aligned
tcp_hashinfo = { <BR>__tcp_ehash: NULL, <BR>__tcp_bhash: NULL,
<BR>__tcp_bhash_size: 0, <BR>__tcp_ehash_size: 0,
<BR>__tcp_listening_hash: { NULL, }, <BR>__tcp_lhash_lock:
RW_LOCK_UNLOCKED, <BR>__tcp_lhash_users: ATOMIC_INIT(0),
<BR>__tcp_lhash_wait:
<BR>__WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.__tcp_lhash_wait),
<BR>__tcp_portalloc_lock: SPIN_LOCK_UNLOCKED <BR>};
<BR><BR><BR>#define tcp_bhash (tcp_hashinfo.__tcp_bhash) <BR>#define
tcp_ehash_size (tcp_hashinfo.__tcp_ehash_size) <BR>#define
tcp_listening_hash (tcp_hashinfo.__tcp_listening_hash)
<BR><BR><BR><BR>歡迎訪問"Unix編程" <BR>telnet apue.dhs.org 2323 <BR>or
http://apue.dhs.org
<P class=small>文章選項: <A
href="http://www.linuxforum.net/forum/printthread.php?Cat=&Board=linuxK&main=147051&type=post"
target=_blank><IMG align=absMiddle alt=打印 border=0
src="2_4網絡代碼閱讀筆(3) - China Linux Forum.files/print.gif"></A>
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=4 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD align=left class=small> </TD>
<TD align=right class=small><A
href="http://www.linuxforum.net/forum/printthread.php?Cat=&Board=linuxK&main=147051&type=thread"
target=_blank><IMG align=top border=0
src="2_4網絡代碼閱讀筆(3) - China Linux Forum.files/printthread.gif"> 打印</A>
</TD></TR></TBODY></TABLE><BR>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD class=tableborders>
<TABLE border=0 cellPadding=3 cellSpacing=1 width="100%">
<TBODY>
<TR class=darktable>
<TD align=right>
<TABLE border=0>
<TBODY>
<TR>
<TD class=navigation noWrap><IMG align=absMiddle alt=*
src="2_4網絡代碼閱讀筆(3) - China Linux Forum.files/greyflat.gif">平坦模式
</TD>
<TD class=navigation noWrap><A
href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=linuxK&Number=147051&page=120&view=collapsed&sb=5&o=all&vc=1"><IMG
align=absMiddle alt=樹狀模式,一封一封讀 border=0
src="2_4網絡代碼閱讀筆(3) - China Linux Forum.files/threaded.gif">樹狀模式</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD align=right>
<FORM action=http://www.linuxforum.net/forum/jumper.php method=post><INPUT
name=Cat type=hidden> <SPAN class=onbody>前往討論區 </SPAN><SELECT
class=formboxes name=board> <OPTION value=-CATJUMP-1>*Linux 社區和文化*
-----<OPTION value=new> 社區公告欄<OPTION
value=uglyduck> 社區服務臺<OPTION
value=linuxnews> 業界新聞與評論<OPTION
value=linuxtalk> 自由軟件雜談<OPTION
value=software> Linux軟件快遞<OPTION
value=Tworkshop> 中文MAN-PAGE計劃(CMPP)<OPTION
value=tcl> Linux圖書與評論<OPTION
value=job> 招聘和求職<OPTION value=-CATJUMP-2>*Linux
桌面與辦公自動化* -----<OPTION value=chinese> Linux
中文環境和中文化<OPTION value=office> Linux桌面與辦公軟件<OPTION
value=game> Linux 多媒體與娛樂版<OPTION
value=mozilla> 自由之窗Mozilla<OPTION
value=laptop> 筆記本電腦上的Linux<OPTION
value=-CATJUMP-3>*Linux 入門及網絡應用* -----<OPTION
value=debian> Debian 一族<OPTION
value=nm> 網絡管理技術<OPTION
value=newbie> Linux 安裝與入門<OPTION
value=web> WEB服務器和FTP服務器<OPTION
value=dns> 域名服務器和郵件服務器<OPTION
value=proxy> Linux防火墻和代理服務器應用<OPTION
value=samba> 文件及打印服務器<OPTION
value=training> 技術培訓與認證<OPTION value=-CATJUMP-4>*Linux
高級應用* -----<OPTION selected
value=linuxK> Linux內核技術<OPTION
value=embedded> 嵌入開發推進計劃 (OpenARM)<OPTION
value=driver> Linux設備驅動程序<OPTION
value=cluster> Linux 集群技術<OPTION
value=db> LINUX平臺數據庫<OPTION
value=cpu> CPU 與 編譯器<OPTION
value=security> 系統和網絡安全<OPTION value=-CATJUMP-5>*Linux
環境下的程序設計* -----<OPTION
value=kylix> LINUX下的快速開發工具(RAD)<OPTION
value=program> C/C++編程版<OPTION
value=php3> PHP 技 術<OPTION
value=java> Java&jsp技術<OPTION
value=vrml> Shell編程技術<OPTION
value=perl> Perl 編 程<OPTION
value=python> Python 編 程<OPTION
value=xml> XML/Web Service 技術<OPTION
value=-CATJUMP-6>*永遠的 UNIX* -----<OPTION
value=unix> 永遠的Unix<OPTION
value=bsd> FreeBSD世界<OPTION value=-CATJUMP-7>*IT 人生*
-----<OPTION value=life> IT 人生</OPTION></SELECT> <INPUT class=buttons name=Jump type=submit value=出發>
</FORM></TD></TR></TBODY></TABLE>
<P>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD class=tableborders>
<TABLE border=0 cellPadding=3 cellSpacing=1 width="100%">
<TBODY>
<TR class=darktable>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD align=left><A href="mailto:davidd@linuxforum.net">Contact
Us</A> </TD>
<TD align=right><A
href="http://www.linuxforum.net/">LINUXFORUM.NET</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -