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