Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660614
  • 博文数量: 186
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2117
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(186)

文章存档

2024年(2)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-07-25 21:44:25

第三章 socket地址设置
3.1 地址设置接口
    调用bind()库函数绑定地址给socket. 从bind()到系统调用的经过:
        bind()-->sys_socketcall()-->sys_bind()-->sockfd_lookup_light()(通过fd找到文件指针struct file*, 再由文件指针struct file*找到struct socket*指针)
                                                                     -->move_addr_to_kernel()(将地址复制到内核中)
                                                                     -->security_socket_bind()
                                                                     -->inet_bind()  
3.2 地址结构定义
        struct socket_in {
        };
        struct sockaddr {
        };
        具体绑定函数由sys_bind()中的err = sock->ops->bind()
        及inet_create()中的sock->ops = answer->ops得知
        sys_bind()中的sock->ops->bind()执行的是inet_bind()
            inet_bind()->sock_net()(取得init_net的指针)
3.3 地址类型
        inet_bind()-->inet_addr_type()-->__inet_dev_addr_type()-->ipv4_is_zeronet()(是零地址吗?)
                                                                                                   -->ipv4_is_lbcast()(是广播地址吗?)
                                                                                                   -->ipv4_is_multicast()(是多播地址吗?)
                                                                                                   -->fib_get_table(net, RT_TABLE_LOCAL)(查找本地路由函数表)-->......
                                                                                                     通过以上多种方式最终得到地类型.

3.4 设置地址和端口
        取端口变量的值snum = ntohs(addr->sin_port);
        记下地址: inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr
                inet_bind()-->inet_csk_get_port()(检验端口及对端口取值)-->inet_get_local_port_range()(端口号取值范围)
                                                                                                           -->inet_csk_bind_conflict()
                                                                                                           -->inet_bind_bucket_create()(创建hash桶,初始化之后链入到hash桶中)
                                                                                                           -->inet_csk()
                                                                                                           -->inet_bind_hash()-->sk_add_bind_node()(将sock链入到桶结构的sock队列)
                                  -->相应的标记及端口/地址记录
3.5 网络空间总管init_net
        ......

阅读(696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~