sockaddr
其定義如下:
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
sin_port:存儲連線埠號(使用網路位元組順序)
sin_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位址;
第三種用一個長整型來表示IP位址。
給in_addr賦值的一種最簡單方法是使用inet_addr函式,它可以把一個代表IP位址的字元串賦值轉換為in_addr類型,如addrto.sin_addr.s_addr=inet_addr("192.168.0.2");
其反函式是inet_ntoa,可以把一個in_addr類型轉換為一個字元串。