[code]#include <netinet/in.h> struct in_addr { in_addr_t s_addr; } struct sockaddr_in{ uint8_t sin_len; //套接字地址結構的字節長度 sa_family_t sin_family; //地址協議簇,unsigned short in_port_t sin_port; //端口, 2 Bytes struct in_addr sin_addr; //ipv4地址,4Bytes char sin_zero[8]; //用於定義額外的結構字段,至少8 Bytes,具體實現看廠商 }
[code]#include <netinet/in.h> struct in6_addr { uint8_t s6_addr[16]; } #define SIN6_LEN; //如果系統支持套接字結構的長度字段,該宏必須定義 struct sockaddr_in6 { uint8_t sin6_len; //套接字地址結構的字節長度 sa_family_t sin6_family; //地址協議簇,unsigned short in_port_t sin6_port; //端口, 2 Bytes uint32_t sin6_flowinfo; struct in6_addr sin6_addr; //ipv6地址,16 Bytes uint32_t sin6_scopt_id; }
[code]#include <arpa/inet.h> //以下兩個函數只用於ipv4地址 int inet_aton(const char *strptr, struct in_addr *addr); char *inet_ntoa(struct in_addr addr); //以下兩個函數可用於ipv4和ipv6地址 int inet_pton(int family, const char *strptr, void *addrptr); const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
[code]#include <arpa/inet.h> int inet_aton(const char *strptr, struct in_addr *addr); char *inet_ntoa(struct in_addr addr);因為這兩個函數是只支持ipv4地址轉換,所以使用到了in_addr這個結構體。
第一個函數字符串若字符串有效則返回1,否則返回0。
第二函數返回指向字符串的指針,而且該指針是指向一個靜態內存當中(系統預先定義靜態數組,inet.h頭文件中寫道:The return value is a pointer to an internal array containing the string),所以所有使用這個函數的返回結構都指向同一個空間,所以該函數不可重入。第二函數參數不是以指針形式傳入。
[code]#include <arpa/inet.h> int inet_pton(int family, const char *strptr, void *addrptr); const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);這兩個函數傳入的地址結構要麼是in_addr,要麼是in6_addr,具體根據family決定。
inet_pton成功返回1,若輸入不是有效就返回0,出錯返回-1。
-inet_ntop成功返回指向結構的指針,出錯返回NULL。
需要注意的是,inet_ntop的第三個參數strptr不能是空指針,它需要調用者事先申請一段空間,地址如果轉換成功,轉換後的字符串地址就存儲在該段空間內,並且返回指向該空間的地址。這樣就可以避免inet_ntoa的不可重入問題。