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);
- }
