标签:32位 形式 整数 pre 数据 保留 索引 应用 nbsp
每个协议族都定义了它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应每个协议地址族的唯一后缀结尾。
IPv4地址和TCP或UDP端口号在套接字地址结构中总是以网络字节序来存储。
struct in_addr { //in_addr_t数据类型是一个至少32位的无符号整数类型 in_addr_t s_addr; /*32位IPv4地址,网络字节序*/ } struct sockaddr_in { uint8_t sin_len; /*无符号8位整数*/ //sa_family_t可以是任何无符号整数类型,在支持长度字段的实现中, //sa_family_t通常是一个8位的无符号整数, //在不支持长度的字段实现中,则是一个长度为16位的无符号整数。 sa_family_t sin_family; /*套接字地址结构的地址族*/ //in_port_t必须是一个至少16位的无符号整数类型 in_port_t sin_port; /*TCP或UDP端口,一般为uint16_t*/ struct in_addr sin_addr; char sin_zero[8];/*未使用*/ }
32位的IPv4地址存在两种不同的访问方法。例如,若serv定义位某个网络套接字地址结构,那么serv.sin_addr将按in_addr结构引用其中的32位IPv4地址,而serv.sin_addr.s_addr将按in_addr_t(通常是一个无符号32位整数)来引用同一个32位IP地址。因此我们必须正确地使用IPv4地址,尤其是在将它作为函数的参数时,因为编译器对传递结构和传递整数的处理是完全不同的。
当作为一个参数传递进任何套接字函数时,套接字地址总是以引用形式来传递,以这样指针作为参数的任何套接字函数必须处理来自所有支持的任何协议族的套接字地址结构,而各个厂商所定义的套接字结构又有区别,所以就定义了一个通用套接字地址结构struct sockaddr,这个结构定义在头文件<sys/socket.h>中:
struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; }
在有结构体长度的地址结构中,sa_family通常是一个8位无符号整数,那么结构体struct sockaddr的长度至少为16个字节。在套接字函数中,通常地址参数是一个指向struct sockaddr类型的指针
从网络应用程序开发的角度来看,通用的套接字地址结构的唯一用途就是对指向特定与协议的套接字地址结构的指针执行强制类型转换,但是在操作系统的内核中,内核必须使用struct sockaddr *类型来检查sa_family字段的值,从而确定这个结构的真实类型。
struct in6_addr { uint8_t s6_addr[16];/*Ipv6的128位地址*/ } #define SIN6_LEN struct sockaddr_in6 { uint8_t sin6_len;/*结构体长度*/ sa_family_t sin6_family;/*协议族*/ in_port_t sin6_port;/*端口,网络字节序*/ uint32_t siin6_flowinfo;/*分成两个字段,低序20位是流标,高序12位保留*/ struct in6_addr sin6_addr;/*IPv6的128位地址,网络字节序*/ uint32_t sin6_scope_id; /*标识具备范围的地址,最常见的是链路局部地址的结构索引*/ }
标签:32位 形式 整数 pre 数据 保留 索引 应用 nbsp
原文地址:https://www.cnblogs.com/tianzeng/p/10465828.html