getaddrinfo函數 詳解

gethostbyname和gethostbyaddr這兩個函數僅僅支持IPv4,getaddrinfo函數可以處理名字到地址以及服務到端口這兩 種轉換,返回的是一個sockaddr結構的鏈表而不是一個地址清單。這些sockaddr結構隨後可由套接口函數直接使用。如此以 來,getaddrinfo函數把協議相關性安全隱藏在這個庫函數內部。應用程序只要處理由getaddrinfo函數填寫的套接口地址結構。該函數在 POSIX規範中定義了。
安全

int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
返回0:  成功
返回非0:  出錯
其中:函數

        hostname:一個主機名或者地址串(IPv4的點分十進制串或者IPv6的16進制串)
        service:一個服務名或者10進制端口號數串。
        hints: 能夠是一個空指針,也能夠是一個指向某個addrinfo結構的指針,調用者在這個結構中填入關於指望返回的信息類型的暗示。舉例來講:若是指定的服務既 支持TCP也支持UDP,那麼調用者能夠把hints結構中的     ai_socktype成員設置成SOCK_DGRAM使得返回的僅僅是適用於數據報套接口 的信息。

本函數經過result指針參數返回一個指向addrinfo結構鏈表的指針,而addrinfo結構定義在頭文件netdb.h中:
        struct addrinfo{
                int       ai_flags;   //具備多個可用的標誌值
                int       ai_family;   //地址族
                int       ai_socktype;   //套接字類型
                int       ai_protocol;    //與與協議族相對應的協議
                socklen_t ai_addrlen;  //套接字地址結構大小
                char    *ai_canonname;
               struct sockaddr *ai_addr;   //通用套接字地址結構指針
                struct addrinfo *ai_next;    //next指針
        };

    若是本函數返回成功,那麼由result參數指向的變量已被填入一個指針,它指向的是由其中的ai_next成員串聯起來的addrinfo結構鏈表。能夠致使返回多個addrinfo結構的情形有如下2個:
        1.    若是與hostname參數關聯的地址有多個,那麼適用於所請求地址簇的每一個地址都返回一個對應的結構。
        2.    若是service參數指定的服務支持多個套接口類型,那麼每一個套接口類型均可能返回一個對應的結構,具體取決於hints結構的ai_socktype成員。
    咱們必須先分配一個hints結構,把它清零後填寫須要的字段,再調用getaddrinfo而後遍歷一個鏈表逐個嘗試每一個返回地址。spa

相關文章
相關標籤/搜索