一,用于存储参与(
IP)Windows/linux套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一
接口函数,使得不同的地址结构可以被
bind()、
connect()、
recvfrom()、
sendto()等
函数调用。但一般的编程中并不直接对此
数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP
套接字开发人员的工具箱仅支持internet
地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。
定义
其定义如下:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
说明:
sa_family :是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:
AF_INET,AF_INET6和AF_UNSPEC。
如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。
AF_UNSPEC则意味着函数返回的是适用于指定
主机名和服务名且适合任何
协议族的地址。如果某个主机既有
AAAA记录(IPV6)地址,同时又有
A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回
通常用的都是AF_INET。
sockaddr_in
其定义如下:
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
sin_family:指代协议族,在socket编程中只能是AF_INET
s
in_addr:存储
IP地址,使用in_addr这个
数据结构sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
而其中in_addr结构的定义如下:
typedef struct in_addr {
union {
struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
struct{ unsigned short s_w1, s_w2;} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;
阐述下in_addr的含义,很显然它是一个存储ip地址的
共用体有三种
表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
给in_addr赋值的一种最简单方法是使用
inet_addr函数,它可以把一个代表IP地址的
字符串赋值其
反函数是
inet_ntoa,可以把一个in_addr
类型转换为一个
字符串。