(1)函数说明
通常,人们在使用过程中都不愿意记忆冗长的IP地址,尤其到IPv6时,地址长度多达128位,那时就更加不可能一次次记忆那么长的IP地址了。因此,使用主机名将会是很好的选择。在Linux中,同样有一些函数可以实现主机名和地址的转化,最为常见的有gethostbyname、gethostbyaddr、getaddrinfo等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。其中gethostbyname是将主机名转化为IP地址,gethostbyaddr则是逆操作,是将IP地址转化为主机名,另外getaddrinfo还能实现自动识别IPv4地址和IPv6地址。
gethostbyname和gethostbyaddr都涉及到一个hostent的结构体,如下所示:
struct hostent{
char *h_name;/*正式主机名*/
char **h_aliases;/*主机别名*/
int h_addrtype;/*地址类型*/
int h_length;/*地址长度*/
char **h_addr_list;/*指向 IPv4或 IPv6 的地址指针数组*/
}
调用该函数后就能返回hostent结构体的相关信息。
getaddrinfo函数涉及到一个addrinfo的结构体,如下所示:
struct addrinfo{
int ai_flags; /*AI_PASSIVE, AI_CANONNAME;*/
int ai_family; /*地址族*/
int ai_socktype; /*socket类型*/
int ai_protocol; /*协议类型*/
size_t ai_addrlen; /*地址长度*/
char *ai_canoname; /*主机名*/
struct sockaddr *ai_addr; /*socket结构体*/
struct addrinfo *ai_next; /*下一个指针链表*/
}
相对hostent结构体而言,addrinfo结构体包含更多的信息。
(2)函数格式
gethostbyname函数语法要点如表 10‑3所示,getaddrinfo函数语法要点如表 10‑4所示。
调用该函数时可以首先对addrinfo结构体中的h_addrtype和h_length进行设置,若为IPv4可设置为AF_INET和4;若为IPv6可设置为AF_INET6和16;若不设置则默认为IPv4地址类型。
在调用之前,首先要对hints服务线索进行设置。它是一个addrinfo结构体,该结构体常见的选项值如表 10‑5所示。
本文转载于唯C教育,【Linux基础】域名、主机名与IP地址转换
http://www.weicedu.com/forum.php?mod=viewthread&tid=228&fromuid=7
(出处: http://www.weicedu.com/)