[学习笔记]套接字地址结构

  套接字函数需要一个指向套接字地址结构的指针作为参数。每个协议定义有属于自己的套接字地址结构,均以“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 ,刚开始接触网络编程,对于数据类型有点迷惑。
询问度娘:就是一个结构的标注,可以理解为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;	//标识地址范围 
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章