在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname()、gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。其中gethostbyname()是将主机名转化为IP地址,gethostbyaddr()则是逆操作,是将IP地址转化为主机名。
函数原型:
1 #include <netdb.h> 2 3 struct hostent* gethostbyname(const char* hostname); 4 5 struct hostent* gethostbyaddr(const char* addr, size_t len, int family);
结构体:
1 struct hostent 2 3 { 4 5 char *h_name; /*正式主机名*/ 6 7 char **h_aliases; /*主机别名*/ 8 9 int h_addrtype; /*主机IP地址类型 IPv4为AF_INET*/ 10 11 int h_length; /*主机IP地址字节长度,对于IPv4是4字节,即32位*/ 12 13 char **h_addr_list; /*主机的IP地址列表*/ 14 15 } 16 17 #define h_addr h_addr_list[0] /*保存的是ip地址*/
函数gethostbyname():用于将域名(www.baidu.com)或主机名转换为IP地址。参数hostname指向存放域名或主机名的字符串。
函数gethostbyaddr():用于将IP地址转换为域名或主机名。参数addr是一个IP地址,此时这个ip地址不是普通的字符串,而是要通过函数inet_aton()转换。len为IP地址的长度,AF_INET为4。family可用AF_INET:Ipv4或AF_INET6:Ipv6。
Example:将百度的www.baidu.com 转换为ip地址
1 #include <netdb.h> 2 3 #include <sys/socket.h> 4 5 #include <stdio.h> 6 7 int main(int argc, char **argv) 8 9 { 10 11 char *ptr, **pptr; 12 13 struct hostent *hptr; 14 15 char str[32] = {'