zoukankan      html  css  js  c++  java
  • 网络编程学习一: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;
    }
    
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/honernan/p/15495984.html
Copyright © 2011-2022 走看看