inet_pton函數和inet_ntop函數的用法及簡單實現


http://blog.csdn.net/eagle51/article/details/53157643?utm_source=itdadao&utm_medium=referral

這兩個函數是隨IPv6出現的新函數,對於IPv4地址和IPv6地址都適用。函數名中的p和n非別代表表達(presentation)和數值(numeric)。地址的表達格式通常是ASCII字符串,數值格式則是存放到套接字地址結構中的二進制值。函數如下:

 

  1. #include<arpa/inet.h>  
  2. int inet_pton(int family, const char *strptr, void *addrptr);  
  3.                                     返回:若成功則為1,若輸入不是有效的表達格式則為0,若出錯則為-1  
  4. const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);  
  5.                                                返回:若成功則為指向結果的指針, 若出錯則為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>頭文件中有如下定義:

 

  1. #define INET_ADDRSTRLEN   16  
  2. #define INET6_ADDRSTRLEN 46  
#define INET_ADDRSTRLEN   16
#define INET6_ADDRSTRLEN 46


        如果len太小,不足以容納表達式結果(包括結尾的空字符),那么返回一個空指針,並置errno為ENOSPC。

 

        inet_ntop函數的strptr參數不可以是一個空指針。調用者必須為目標存儲單元分配內存並指定其大小。調用成功時,這個指針就是該函數的返回值。

        即使系統還不支持IPv6,也可以采取下列措施開始使用這些新函數,即用代碼

 

  1. inet_pton(AF_INET, cp, &foo.sin_addr);  
  2. 代替代碼  
  3. foo.sin_addr.s_addr = inet_addr(cp);  
  4. 再用代碼  
  5. char str[INET_ADDRSTRLEN];  
  6. ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));  
  7. 代替代碼  
  8. 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函數的簡化版本。

 

  1. int inet_pton(int family, const char *strptr, void *addrptr)  
  2. {  
  3.     if(family == AF_INET) {  
  4.         struct in_addr in_val;  
  5.         if (inet_aton(strptr, &in_val)) {  
  6.             memcpy(addrptr, &in_val, sizeof(struct in_addr));  
  7.             return (0);  
  8.         }  
  9.     }  
  10.     errno = EAFNOSUPPORT;  
  11.     return (-1);  
  12. }  
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);
}

 

 

  1. const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t lne)  
  2. {  
  3.     const u_char *p = (const u_char *) addrptr;  
  4.     if(family == AF_INET) {  
  5.         char temp[INET_ADDRSTRLEN];  
  6.         snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);  
  7.         if (strlen(temp) >= len){  
  8.             errno = ENOSPC;  
  9.             return (NULL);  
  10.         }  
  11.         strcpy(strptr, temp);  
  12.         return (strptr);  
  13.     }  
  14.     errno = EAFNOSUPPORT;  
  15.     return (NULL);  
  16. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM