⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2_4网络代码阅读笔(3) - china linux forum.htm

📁 包括较少的一些linux下的网络代码阅读笔记
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            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>&gt;&gt;&gt;&gt;更改状态 <BR>sk-&gt;state = 
            TCP_LISTEN; <BR>&gt;&gt;&gt;&gt;如果没有对端口赋值,则查找一个合适的端口, 
            <BR>&gt;&gt;&gt;&gt;这里调用的函数是tcp_v4_get_port,我们已经详细分析了 <BR>if 
            (sk-&gt;prot-&gt;get_port(sk, sk-&gt;num) == 0) { <BR>sk-&gt;sport = 
            htons(sk-&gt;num); 
            <BR>&gt;&gt;&gt;&gt;得到sk-&gt;dst_cache的指针,然后将其置为NULL,然后将sk-&gt;dst_cache 
            <BR>&gt;&gt;&gt;&gt;所指的路由缓存使用计数减1 <BR>sk_dst_reset(sk); 
            <BR>&gt;&gt;&gt;&gt;调用tcp_v4_hash,见下面分析 
            <BR>sk-&gt;prot-&gt;hash(sk); <BR>return 0; <BR>} <BR>sk-&gt;state = 
            TCP_CLOSE; <BR>write_lock_bh(&amp;tp-&gt;syn_wait_lock); 
            <BR>tp-&gt;listen_opt = NULL; 
            <BR>write_unlock_bh(&amp;tp-&gt;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-&gt;pprev==NULL); <BR>if(sk-&gt;state == TCP_LISTEN) 
            { <BR>&gt;&gt;&gt;&gt;如果是倾听状态,则将其链入到tcp_listening_hash表中,hash值根据端口 
            <BR>&gt;&gt;&gt;&gt;号计算. <BR>skp = 
            &amp;tcp_listening_hash[tcp_sk_listen_hashfn(sk)]; <BR>lock = 
            &amp;tcp_lhash_lock; <BR>tcp_listen_wlock(); <BR>} else { 
            <BR>&gt;&gt;&gt;&gt;否则,则将其链入到tcp_ehash链表中,什么时候会将其连接到tcp_ehash中 
            <BR>&gt;&gt;&gt;&gt;有待于后面的分析. <BR>skp = 
            &amp;tcp_ehash[(sk-&gt;hashent = tcp_sk_hashfn(sk))].chain; <BR>lock 
            = &amp;tcp_ehash[sk-&gt;hashent].lock; <BR>write_lock(lock); <BR>} 
            <BR>&gt;&gt;&gt;&gt;将它连到hash表的前面,如果后面还有其它的hash值相同的元素,则将这个元素的 
            <BR>&gt;&gt;&gt;&gt;的前向指针指向我们这个sock的next域 <BR>if((sk-&gt;next = 
            *skp) != NULL) <BR>(*skp)-&gt;pprev = &amp;sk-&gt;next; <BR>*skp = 
            sk; <BR>&gt;&gt;&gt;&gt;我们这个sock的前向指针指向hash表头. <BR>sk-&gt;pprev = 
            skp; <BR>sock_prot_inc_use(sk-&gt;prot); <BR>write_unlock(lock); 
            <BR>if (sk-&gt;state == TCP_LISTEN) 
            <BR>wake_up(&amp;tcp_lhash_wait); <BR>} <BR><BR>到目前为止,我们已经遇到了struct 
            sock如下的指针: <BR><BR>第一组: <BR>/* Local port binding hash linkage. */ 
            <BR>&gt;&gt;&gt;&gt;将绑定到相同端口的sock连接起来的指针 <BR>struct sock *bind_next; 
            <BR>struct sock **bind_pprev; 
            <BR>&gt;&gt;&gt;&gt;这个指针指向所在的tcp_bind_bucket结构 <BR>struct sock 
            *prev; <BR>第二组: <BR>/* Main hash linkage for various protocol lookup 
            tables. */ <BR>&gt;&gt;&gt;&gt;将处于同一状态的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=&amp;Board=linuxK&amp;main=147051&amp;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>&nbsp; </TD>
    <TD align=right class=small><A 
      href="http://www.linuxforum.net/forum/printthread.php?Cat=&amp;Board=linuxK&amp;main=147051&amp;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">平坦模式&nbsp; 
                </TD>
                <TD class=navigation noWrap><A 
                  href="http://www.linuxforum.net/forum/showthreaded.php?Cat=&amp;Board=linuxK&amp;Number=147051&amp;page=120&amp;view=collapsed&amp;sb=5&amp;o=all&amp;vc=1"><IMG 
                  align=absMiddle alt=树状模式,一封一封读 border=0 
                  src="2_4网络代码阅读笔(3) - China Linux Forum.files/threaded.gif">树状模式</A>&nbsp; 
                </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>&nbsp;&nbsp;&nbsp;社区公告栏<OPTION 
        value=uglyduck>&nbsp;&nbsp;&nbsp;社区服务台<OPTION 
        value=linuxnews>&nbsp;&nbsp;&nbsp;业界新闻与评论<OPTION 
        value=linuxtalk>&nbsp;&nbsp;&nbsp;自由软件杂谈<OPTION 
        value=software>&nbsp;&nbsp;&nbsp;Linux软件快递<OPTION 
        value=Tworkshop>&nbsp;&nbsp;&nbsp;中文MAN-PAGE计划(CMPP)<OPTION 
        value=tcl>&nbsp;&nbsp;&nbsp;Linux图书与评论<OPTION 
        value=job>&nbsp;&nbsp;&nbsp;招聘和求职<OPTION value=-CATJUMP-2>*Linux 
        桌面与办公自动化* -----<OPTION value=chinese>&nbsp;&nbsp;&nbsp;Linux 
        中文环境和中文化<OPTION value=office>&nbsp;&nbsp;&nbsp;Linux桌面与办公软件<OPTION 
        value=game>&nbsp;&nbsp;&nbsp;Linux 多媒体与娱乐版<OPTION 
        value=mozilla>&nbsp;&nbsp;&nbsp;自由之窗Mozilla<OPTION 
        value=laptop>&nbsp;&nbsp;&nbsp;笔记本电脑上的Linux<OPTION 
        value=-CATJUMP-3>*Linux 入门及网络应用* -----<OPTION 
        value=debian>&nbsp;&nbsp;&nbsp;Debian 一族<OPTION 
        value=nm>&nbsp;&nbsp;&nbsp;网络管理技术<OPTION 
        value=newbie>&nbsp;&nbsp;&nbsp;Linux 安装与入门<OPTION 
        value=web>&nbsp;&nbsp;&nbsp;WEB服务器和FTP服务器<OPTION 
        value=dns>&nbsp;&nbsp;&nbsp;域名服务器和邮件服务器<OPTION 
        value=proxy>&nbsp;&nbsp;&nbsp;Linux防火墙和代理服务器应用<OPTION 
        value=samba>&nbsp;&nbsp;&nbsp;文件及打印服务器<OPTION 
        value=training>&nbsp;&nbsp;&nbsp; 技术培训与认证<OPTION value=-CATJUMP-4>*Linux 
        高级应用* -----<OPTION selected 
        value=linuxK>&nbsp;&nbsp;&nbsp;Linux内核技术<OPTION 
        value=embedded>&nbsp;&nbsp;&nbsp;嵌入开发推进计划 (OpenARM)<OPTION 
        value=driver>&nbsp;&nbsp;&nbsp;Linux设备驱动程序<OPTION 
        value=cluster>&nbsp;&nbsp;&nbsp;Linux 集群技术<OPTION 
        value=db>&nbsp;&nbsp;&nbsp;LINUX平台数据库<OPTION 
        value=cpu>&nbsp;&nbsp;&nbsp;CPU 与 编译器<OPTION 
        value=security>&nbsp;&nbsp;&nbsp;系统和网络安全<OPTION value=-CATJUMP-5>*Linux 
        环境下的程序设计* -----<OPTION 
        value=kylix>&nbsp;&nbsp;&nbsp;LINUX下的快速开发工具(RAD)<OPTION 
        value=program>&nbsp;&nbsp;&nbsp;C/C++编程版<OPTION 
        value=php3>&nbsp;&nbsp;&nbsp;PHP 技 术<OPTION 
        value=java>&nbsp;&nbsp;&nbsp;Java&amp;jsp技术<OPTION 
        value=vrml>&nbsp;&nbsp;&nbsp;Shell编程技术<OPTION 
        value=perl>&nbsp;&nbsp;&nbsp;Perl 编 程<OPTION 
        value=python>&nbsp;&nbsp;&nbsp;Python 编 程<OPTION 
        value=xml>&nbsp;&nbsp;&nbsp;XML/Web Service 技术<OPTION 
        value=-CATJUMP-6>*永远的 UNIX* -----<OPTION 
        value=unix>&nbsp;&nbsp;&nbsp;永远的Unix<OPTION 
        value=bsd>&nbsp;&nbsp;&nbsp;FreeBSD世界<OPTION value=-CATJUMP-7>*IT 人生* 
        -----<OPTION value=life>&nbsp;&nbsp;&nbsp;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 + -