http://blog.csdn.net/eagle51/article/details/53157643?utm_source=itdadao&utm_medium=referral
這兩個函數是隨IPv6出現的新函數,對于IPv4地址和IPv6地址都適用。函數名中的p和n非別代表表達(presentation)和數值(numeric)。地址的表達格式通常是ASCII字符串,數值格式則是存放到套接字地址結構中的二進制值。函數如下:
?
- #include<arpa/inet.h>??
- int?inet_pton(int?family,?const?char?*strptr,?void?*addrptr);??
- ????????????????????????????????????返回:若成功則為1,若輸入不是有效的表達格式則為0,若出錯則為-1??
- const?char?*inet_ntop(int?family,?const?void?*addrptr,?char?*strptr,?size_t?len);??
- ???????????????????????????????????????????????返回:若成功則為指向結果的指針,?若出錯則為NULL??
#include<arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);返回:若成功則為1,若輸入不是有效的表達格式則為0,若出錯則為-1
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);返回:若成功則為指向結果的指針, 若出錯則為NULL
??????? 這兩個函數的family參數既可以是AF_INET,也可以是AF_INET6。如果以不被支持的地址族作為family的參數,這兩個函數就都返回一個錯誤,并將errno置為EAFNOSUPPORT。
?
第一個函數嘗試轉換由strptr指針所指的字符串,并通過addrptr指針存放二進制結果。若成功則返回1,否則如果對所指定的family而言輸入的字符串不是有效的表達式,那么值為0。
??????? inet_ntop進行相反的轉換,從數值格式(addrptr)轉換到表達格式(strptr)。len參數是目標存儲單元的大小,以免該函數溢出其調用者的緩沖區。為有助于指定這個大小,在<netinet/in.h>頭文件中有如下定義:
?
- #define?INET_ADDRSTRLEN???16??
- #define?INET6_ADDRSTRLEN?46??
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
??????? 如果len太小,不足以容納表達式結果(包括結尾的空字符),那么返回一個空指針,并置errno為ENOSPC。
?
??????? inet_ntop函數的strptr參數不可以是一個空指針。調用者必須為目標存儲單元分配內存并指定其大小。調用成功時,這個指針就是該函數的返回值。
??????? 即使系統還不支持IPv6,也可以采取下列措施開始使用這些新函數,即用代碼
?
- inet_pton(AF_INET,?cp,?&foo.sin_addr);??
- 代替代碼??
- foo.sin_addr.s_addr?=?inet_addr(cp);??
- 再用代碼??
- char?str[INET_ADDRSTRLEN];??
- ptr?=?inet_ntop(AF_INET,?&foo.sin_addr,?str,?sizeof(str));??
- 代替代碼??
- ptr?=?inet_ntoa(foo.sin_addr);??
inet_pton(AF_INET, cp, &foo.sin_addr);
代替代碼
foo.sin_addr.s_addr = inet_addr(cp);
再用代碼
char str[INET_ADDRSTRLEN];
ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));
代替代碼
ptr = inet_ntoa(foo.sin_addr);
?
下面給出只支持IPv4的inet_pton函數的簡單定義和只支持IPv4的inet_ntop函數的簡化版本。
?
- int?inet_pton(int?family,?const?char?*strptr,?void?*addrptr)??
- {??
- ????if(family?==?AF_INET)?{??
- ????????struct?in_addr?in_val;??
- ????????if?(inet_aton(strptr,?&in_val))?{??
- ????????????memcpy(addrptr,?&in_val,?sizeof(struct?in_addr));??
- ????????????return?(0);??
- ????????}??
- ????}??
- ????errno?=?EAFNOSUPPORT;??
- ????return?(-1);??
- }??
int inet_pton(int family, const char *strptr, void *addrptr)
{if(family == AF_INET) {struct in_addr in_val;if (inet_aton(strptr, &in_val)) {memcpy(addrptr, &in_val, sizeof(struct in_addr));return (0);}}errno = EAFNOSUPPORT;return (-1);
}
?
?
- const?char?*?inet_ntop(int?family,?const?void?*addrptr,?char?*strptr,?size_t?lne)??
- {??
- ????const?u_char?*p?=?(const?u_char?*)?addrptr;??
- ????if(family?==?AF_INET)?{??
- ????????char?temp[INET_ADDRSTRLEN];??
- ????????snprintf(temp,?sizeof(temp),?"%d.%d.%d.%d",?p[0],?p[1],?p[2],?p[3]);??
- ????????if?(strlen(temp)?>=?len){??
- ????????????errno?=?ENOSPC;??
- ????????????return?(NULL);??
- ????????}??
- ????????strcpy(strptr,?temp);??
- ????????return?(strptr);??
- ????}??
- ????errno?=?EAFNOSUPPORT;??
- ????return?(NULL);??
- } ?