Linux内核分析 - 网络[十二]:UDP模块 - socket
取得内核存放sock的表,对于udp socket来说,就是udp_table,它在udp_prot中被定义。在udp_table的 创建过程中已经看到,udp_table有两个hash表:hash和hash2,两者大小相同,只是前者用snum作哈希值,后者用saddr, snum 作哈希值。使用两个hash表的目的在于加速查找,先用snum在hash中查找,再用saddr, snum在hash2中查找,最后根据效率决定 在hash或hash2中查找。 struct udp_table *udptable = sk->sk_prot->h.udp_table; 根据snum的不同会执行不同的操作,snum为0则先选择一个可用端口号,再插入;snum不为0则先确定之前没有存 储相应sk,再插入。 if (!snum) { snum==0代码段 } else { snum!=0代码段 } 如果snum!=0,此时执行else部分代码。hslot是从udp_table中hash表取出的表项,键值是snum。 hslot = udp_hashslot(udptable, net, snum); 如果hslot->count大于10, 即在hash表中以snum为键值的项的数目在于10,此时改用在hash2表中查找。如果hslot->count不足10,那么直接在hash表中 查找就可以了。这样划分是出于效率的考虑。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |