IP地址的字符串形式和數字形式之間的相互轉換函數

 /*html

  最近要用到網絡編程的東西,差一點本身去山寨已有的函數。基礎很差,不知道已有函數能夠知足須要,呵呵。   這個示例程序說的是ip地址的數字形式和字符串形式之間的相互轉換。   從字符串形式轉換到數字形式: inet_pton -- presentation to numeric    從數字形式轉換到字符串形式: inet_ntop -- numeric to presentation      #include <arpa/inet.h>   int inet_pton(int af, const char *src, void *dst);   參數af指的是地址族,取值AF_INET,若是是IPV4; 或AF_INET6,若是是IPV6      src指向是要轉換的字符串的指針。      dst是存放轉換後的數字形式的地址存放的地方。   返回值: 當成功時返回1,錯誤時返回0     #include <arpa/inet.h>   const char *inet_ntop(int af, const void *src,                         char *dst, socklen_t size);   參數af的意義同上,      src指向要轉換的數字形式的指針。      dst指向存放結果空間的指針      size,若是要轉換ipv4地址,由宏INET_ADDRSTRLEN定義,取值16。                             由於最長的ipv4地址的字符串形式就是16字節。                             例如"255.255.255.255"就是15個字符加一個'\0'結束符。            若是要轉換ipv6地址,由宏INET6_ADDRSTRLEN定義,取46。                             至於爲何取46而不取40,我也搞不清楚。                             最長的IPV6地址的字符串形式是40字節。                             例如"2001:2001:2001:2001:2001:2001:2001:2001"就是40字節。 */
 
 
#include <arpa/inet.h>
#include <stdio.h>
 
int main()
{
    int i = 0;
    char *ipv4 = "10.3.6.123";
    char *ipv6 = "2001:db8:0:1234:0:567:1:1";
    unsigned char bufipv4[4] = {0};
    unsigned char bufipv6[16] = {0};
    char to_ipv4[INET_ADDRSTRLEN] = {0};
    char to_ipv6[INET6_ADDRSTRLEN] = {0};
 
    //把字符串10.3.6.123轉換成數字的形式,並存儲在bufipv4中。並輸出驗證是否轉換成功
    if( inet_pton(AF_INET, ipv4, bufipv4) == 1) 
        for(i=0; i<sizeof(bufipv4); ++i)
            printf("%d ", bufipv4[i]);
 
    printf("\n");
 
    //把字符串ipv6轉換成數字的形式,並存儲在bufipv6中。並輸出驗證是否成功。
    if( inet_pton(AF_INET6, ipv6, bufipv6)==1 ) 
        for(i=0; i<sizeof(bufipv6); ++i)
            printf("%x ", bufipv6[i]);
 
    printf("\n");
 
    //把數字形式的地址轉換成字符串的形式
    printf("%s\n", inet_ntop(AF_INET, bufipv4, to_ipv4, INET_ADDRSTRLEN));
    printf("%s\n", inet_ntop(AF_INET6, bufipv6, to_ipv6, INET6_ADDRSTRLEN));
 
    return 0;
}
/* 輸出以下: 10 3 6 123  20 1 d b8 0 0 12 34 0 0 5 67 0 1 0 1  10.3.6.123 2001:db8:0:1234:0:567:1:1 */
相關文章
相關標籤/搜索