1. 程式人生 > >地址轉換函式inet_aton、 inet_ntoa、 inet_addr和inet_pton 、inet_ntop

地址轉換函式inet_aton、 inet_ntoa、 inet_addr和inet_pton 、inet_ntop

inet_aton,inet_addrinet_ntoa在點分十進位制數串(如,“192.168.1.10")與他的32位網路位元組二進位制值之間轉換IPV4地址,有2個比較新的函式inet_ptoninet_ntop,這2個對IPV4IPV6地址都能處理。

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>
       int inet_aton(const char *cp, struct in_addr *inp);
       in_addr_t inet_addr(const char *cp);

       char *inet_ntoa(struct in_addr in);

(一)inet_aton() 

轉換網路主機地址cp為二進位制數值,並存儲在struct in_addr結構中,即第二個引數*inp,函式返回非0表示cp主機有地有效,返回0表示主機地址無效。

       inet_aton() converts the Internet host address cp from the standard numbers-and-dots notation into binary data and stores it in the structure that inp points to. inet_aton() returns non-zero if the address is valid, zero if not.


(二)inet_addr

函式轉換網路主機地址(如192.168.1.10)為網路位元組序二進位制值,如果引數char *cp無效,函式返回-1(INADDR_NONE),這個函式在處理地址為255.255.255.255時也返回1,255.255.255.255是一個有效的地址,不過inet_addr無法處理;

The inet_addr() function converts the Internet host address cp from numbers-and-dots notation into binary data in network byte order.   If the input is invalid, INADDR_NONE (usually -1) is returned. This is an


 obsolete interface to inet_aton(), described immediately above; it is obsolete   because   -1 is a valid address (255.255.255.255), and inet_aton() provides a cleaner way to indicate error return.


The inet_ntoa() function converts the Internet host address in given in network byte order to a string in standard numbers-and-dots notation. The string is returned in a statically allocated buffer, which subse

(三)inet_ntoa 

函式轉換網路位元組排序的地址為標準的ASCII以點分開的地址,,該函式返回指向點分開的字串地址的指標,該字串的空間為靜態分配的,這意味著在第二次呼叫該函式時,上一次呼叫將會被重寫(覆蓋),所以如果需要儲存該串最後複製出來自己管理!

The inet_ntoa() function converts the Internet host address in given in network byte order to a string in standard numbers-and-dots notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite.

現在一般使用inet_atoninet_ntoa來處理網路位元組和主機位元組之間的轉換;

(四)兩個更新的函式inet_ptoninet_ntop2個函式能夠處理ipv4ipv6,原型如下

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

這個函式轉換字串到網路地址,第一個引數af是地址族,轉換後存在dst
inet_pton 
inet_addr的擴充套件,支援的多地址族有下列:

AF_INET
       src
為指向字元型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函式將該地址轉換為in_addr的結構體,並複製在*dst

AF_INET6
       src
為指向IPV6的地址,,函式將該地址轉換為in6_addr的結構體,並複製在*dst如果函數出錯將返回一個負值,並將errno設定為EAFNOSUPPORT,如果引數af指定的地址族和src格式不對,函式將返回0函式inet_ntop進行相反的轉換原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
這個函式轉換網路二進位制結構到ASCII型別的地址,引數的作用和上面相同,只是多了一個引數socklen_t cnt,他是所指向快取區dst的大小,避免溢位,如果快取區太小無法儲存地址的值,則返回一個空指標,並將errno置為ENOSPC

===============================================================================

例子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(void)
{
    char* ip = "192.168.1.87";
    struct in_addr inp;
    u_int32_t addr = 0x5701a8c0;
    inet_aton(ip, &inp);
    printf("%x ", inp);
    inp.s_addr = addr;

    printf("%s \n", inet_ntoa(inp));

    printf("%x \n",inet_addr(ip));

    return 0;

}

// Internet address.
struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr; /* port in network byte order */
        } S_un;
#define s_addr  S_un.S_addr
};
// Socket address, internet style.
struct sockaddr_in {        // struct sockaddr的一種特殊形式
        short            sin_family;    /* address family: AF_INET */
        u_short        sin_port;        /* port in network byte order */
        struct in_addr sin_addr;        /* port in network byte order */
        char            sin_zero[8];    /* 8 byte pad */
};
// Structure used by kernel to store most addresses.
struct sockaddr {
        u_short sa_family; /* address family */
        char    sa_data[14]; /* up to 14 bytes of direct address */
};

struct in_addr {
    unsigned long int s_addr;
}