• 网络编程学习一:IP地址转换函数


    IP地址转换函数:inet_aton, inet_nota, inet_addr和inet_pton, inet_ntop

    ​ C中提供的点分十进制IP字符串与整数(二进制)表示的转化可以根据是否支持IPV6分为两类,第一类是仅支持IPV4的,包括,inet_aton,inet_nota,inet_addr。它们的声明及用法如下:

    #include <arpa/inet.h>
    in_addr_t inet_addr(const char* strptr);
    int inet_aton(const char*cp, struct in_addr* inp);
    char* inet_ntoa( struct in_addr in);
    
    其中in_addr为表示IPv4地址的结构体:
    struct in_addr
    {
      u_int32_t s_addr;
    };
    
    来自表示IPv4的socket:
    struct sockaddr_in
    {
      sa_family_t sin_family;			//地址族
      u_int16_t sin_port;					//端口号
      struct in_addr sin_addr;		//IPv4地址结构体
    }
    

    具体用法:

    #include <stdio.h>
    #include <arpa/inet.h>
    
    int main(){
        char* ip = "127.0.0.1";
        struct in_addr addr;
    
    //ip字符串转换为整数IP地址的两种方法
        addr.s_addr = inet_addr(ip);
        inet_aton(ip, &addr);
        printf("%d
    ",addr.s_addr);
    //整数ip转换为ip字符串
        char* sz1 = inet_ntoa(addr);
        printf("%s
    ", sz1);
      
        return 0;
    }
    

    注意事项,inet_nota函数内部使用了一个静态变量存储转化结果,函数的返回值指向该静态内存,所以inet_nota是不可重入的。举例如下:

    #include <arpa/inet.h>
    #include <stdio.h>
    
    int main(){
        char* ip = "127.0.0.1";
        char* ip2 = "172.22.1.2";
        struct in_addr addr;
        struct in_addr addr2;
    
        inet_aton(ip, &addr);
        inet_aton(ip2, &addr2);
        
        char* sz1 = inet_ntoa(addr);
        char* sz2 = inet_ntoa(addr2);
        printf("%s
    ", sz1);
        printf("%s
    ", sz2);
    
        return 0;
    }
    
    /*输出结果
    	172.22.1.2
    	172.22.1.2
    */
    

    第二类为同时支持IPv4和IPv6。包括,inet_pton和inet_ntop。其定义如下:

    #include <netinet/in.h>
    int inet_pton(int af, const char* src, void* dst);
    //返回:成功返回1;输入格式无效返回0;出错返回-1。
    const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);
    //返回:成功返回指向结果的指针;出错返NULL。
    #define INET_ADDRSTRLEN 16
    #define INET6_ADDRSTRLEN 46
    
    

    其中各参数的含义如下:

    • af参数指定地址族。可选为:AF_INET和AF_INET6;

    • src为转换源,dst为转换目标。这里要注意的是,不能传给inet_ntop一个空指针,必须是一个已分配目标大小内存的指针。

    • cnt参数指定目标存储单位的大小。上面定义的两个宏可以帮助指定IPv4和IPv6的特定大小。
      用法如下:

    #include <arpa/inet.h>
    #include <stdio.h>
    
    int main(){
        char* ip = "1.2.3.4";
        struct in_addr addr;
    
        int i = 0;
        int *ad = &i;
        inet_pton(AF_INET, ip, ad);
        printf("%d
    ", *ad);
    
        char ip2[INET_ADDRSTRLEN];
        char* ip3 = inet_ntop(AF_INET, ad, ip2, INET_ADDRSTRLEN);
        printf("%s
    ", ip2);
        printf("%s
    ", ip3);
    
        return 0;
    }
    
  • 相关阅读:
    算法之冒泡排序(Java语言)
    算法之水仙花数(Java语言)
    md5加密解析
    Java项目中环境变量的问题
    外行码农进阶学习指导思想
    初识TCP
    const修饰符总结
    网格计算的三种体系结构概述
    虚函数的实现
    网络计算概述
  • 原文地址:https://www.cnblogs.com/honernan/p/15495984.html
Copyright © 2020-2023  润新知