zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    Java蛇形数组的简单实现代码
    Android Studio生成javadoc出错的解决办法
    AngularJS指令嵌套时link函数执行顺序的问题
    [转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?
    扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合
    人机交互的新方向:智能聊天机器人
    利用python自动清除Android工程中的多余资源
    巧用svn create patch(打补丁)方案解决定制版需求
    【Android开发坑系列】之经常被忽略的背景图片内存泄露
    【Android开发坑系列】之try-catch
  • 原文地址:https://www.cnblogs.com/loanhicks/p/7368151.html
Copyright © 2011-2022 走看看