利用域名获取IP
gethostbyname()
(该函数在Linux手册中已经被标注[[deprecated]]
,不建议再使用。)
#include <netdb.h>
struct hostent* gethostbyname(const char* hostname);
入参是域名字符串,返回值中存储了对应的IP地址。
struct hostent
{
char *h_name; /* Official name of host. */
char **h_aliases; /* Alias list. */
int h_addrtype; /* Host address type. */
int h_length; /* Length of address. */
char **h_addr_list; /* List of addresses from name server. */
}
除了返回IP信息外,还带有其他信息。
域名转IP只需要关注h_addr_list
。
- h_name
存有官方域名。官方域名代表某一主页,但实际上,一些著名公司的域名并未用官方域名注册。 - h_aliases
可以通过多个域名访问同一主页。同一IP可以绑定多个域名,因此,除官方域名外还可指定其他域名。这些信息存在h_aliases
中。 - h_addrtype
gethostname()
支持IPV4和IPV6。通过此变量获取保存在h_addr_list
的IP地址信息,如果是IPV4,则该变量存有AF_INET
。 - h_length
保存的IP地址长度。IPV4是4字节,IPV6是16字节。 - h_addr_list
以点分十进制保存域名对应的IP地址。
Example
#include <netdb.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
int i;
struct hostent *host;
if (argc != 2)
{
printf("Usage: %s <addr>\n", argv[0]);
return 0;
}
host = gethostbyname(argv[1]);
if (host == NULL)
{
perror("error()");
return -1;
}
printf("Official name: %s\n", host->h_name);
for (int i = 0; host->h_aliases[i]; ++i)
{
printf("Aliases %d: %s\n", i + 1, host->h_aliases[i]);
}
printf("Address type: %s\n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");
for( int i=0;host->h_addr_list[i] ;++i ){
printf("IP addr %d: %s \n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
}
}