套接字函数需要一个指向套接字地址结构的指针作为参数。每个协议定义有属于自己的套接字地址结构,均以“sockaddr”开头,
例如:1、IPv4套接字地址结构以 “ sockaddr_in ”命名
2、IPv6套接字地址结构以 " sockaddr_in6 ” 命名
1、通用套接字地址结构
现在一般不用了,用途:对指向特定协议的套接字地址结构的指针进行强制类型转换。
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;/*协议族地址类型*/
char sa_data[14];/*存储具体协议地址*/
};
2、IPv4 地址结构
先定义一个结构体用来表示32位IPv4地址
struct in_addr{
in_addr_t s_addr;//用来表示32位IPv4地址
};
in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序(network byte ordered),即该无符号整数采用大端字节序。.其中中每8位代表一个IP地址位中的一个数值.
例如192.168.3.144记为0x 90 03 a8 c0,其中 c0 为192 ,a8 为 168, 03 为 3 , 90 为 144。打印的时候调用inet_ntoa()函数将其转换为char *类型。解惑:*_t ,刚开始接触网络编程,对于数据类型有点迷惑。
32位IPv4地址结构有两种访问方法:例如serv定义为某套接字地址结构:1、serv.sin_addr 将in_addr结构来引用32位IPv4,2、serv.sin_addr.s_addr将按照in_addr_t(无符号32位整数)来引用。
询问度娘:
就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。
struct sockaddr_in{
uint8_t sin_len;/*为了增加OSI协议支持增加的,简化了长度可变套接字地址结构处理 */
sa_family_t sin_family;/*地址族*/
in_port_t sin_port; /*16位TCP or UDP端口号*/
struct in_addr sin_addr; /*32位IP地址*/
char sin_zero[8];/* 未使用,置为0*/
};
32位IPv4地址结构有两种访问方法:例如serv定义为某套接字地址结构:1、serv.sin_addr 将in_addr结构来引用32位IPv4,2、serv.sin_addr.s_addr将按照in_addr_t(无符号32位整数)来引用。
3、IPv6地址结构
struct in6_addr
{
uint8_t s6_addr[16]; //按照网络字节顺序存储128位IPv6地址
};
#DEFINE SIN6_LEN
struct sockaddr_in6
{
uint8_t sin6_len; //IPv6结构长度,是一个无符号的8为整数,表示128为IPv6地址长度
sa_family_t sin6_family; //地址族AF_INET6
in_port_t sin6_port; //存储端口号,按网络字节顺序
uint32_t sin6_flowinfo; //低24位是流量标号,然后是4位的优先级标志,剩下四位保留
struct in6_addr sin6_addr; //IPv6地址,网络字节顺序
uint32_t sin6_scope_id; //标识地址范围
};