第三章 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
......
阅读(746) | 评论(0) | 转发(0) |