套接口位址結構 大多數套接口函數都需要一個指向套接口位址結構的指針作為參數。每個協定都定義他自己的套接口位址結構,以“sokcaddr_”開頭,并以對應其協定族的唯一字尾結束。
IPv4套接口位址
以“sockaddr_in”命名,定義在<netinet/in.h>頭檔案中
struct in_addr
{
in_addr_t s_addr; //32bit IP address
};
struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_fimily; //AF_INET
in_port_t sin_port; //16-bit TCP or UDP port number
//Network Byte Ordered
struct in_addr sin_addr; //32_bit IPv4 address
//Network byte ordered
char sin_zero[8];
};
sa_family_t:套接口位址結構位址族
socklen_t:套接口位址結構長度,為uint32_t
in_addr_t:IPv4位址,一般為uint32_t
in_port_t:端口,一般為uint16_t
IPv4兩種使用方法:serv.sin_addr表示的是struct in_addr結構;而serv.sin_addr.in_addr
表示的是一個uint32整數。
當作為參數傳遞給任一個套接口函數時,套接口位址結構是通過指針傳遞的。但是通過指針來取得此參數的函數必須處理來自所支援的任何協定族的套接口位址結構。是以在<sys/socket.h>中定義一個通用位址接口:
struct sockaddr
{
uint8_t sa_len;
sa_fanily_t sa_family;
char sa_data[14];
};
IPv6套接口位址結構
以“sockaddr_in6”命名,定義在<netinet/in.h>頭檔案中
struct in6_addr
{
uint8_t s6_addr[16]; //128-bit IPv6 address
};
#define SIN6_LEN //如果系統支援結構中的長度成員,則必須定義SIN6_LEN
struct sockaddr_in6
{
uint8_t sin6_len;
sa_family_t sin6_fimily; //AF_INET6
in_port_t sin6_port; //16-bit TCP or UDP port number
//Network Byte Ordered
uint32_t sin6_flowinfo; //priority & flow lable
struct in6_addr sin6_addr; // IPv6 address
//Network byte ordered
};
位址轉換換書在位址的文本表達和套接口位址結構中的二進制值之間進行轉換。
IPv4使用:inet_addr和inet_ntoa
IPv4和IPv6都可使用:inet_pton和inet_ntop