gethostbyname()域名解析到IP

利用域名获取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]));
    }
}

参考书籍《TCP/IP网络编程》尹圣雨

相关推荐

  1. gethostbyname()域名解析IP

    2024-03-25 14:50:06       43 阅读
  2. ESP32 域名解析得到IP地址

    2024-03-25 14:50:06       47 阅读
  3. Nginx解析域名指定端口

    2024-03-25 14:50:06       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 14:50:06       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 14:50:06       107 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 14:50:06       90 阅读
  4. Python语言-面向对象

    2024-03-25 14:50:06       98 阅读

热门阅读

  1. IP 报头和以太网报头

    2024-03-25 14:50:06       37 阅读
  2. TypeError: Descriptors cannot not be created directly.

    2024-03-25 14:50:06       37 阅读
  3. 位运算符与位移运算符

    2024-03-25 14:50:06       35 阅读
  4. SGP.22-v2.2.2-Application-note

    2024-03-25 14:50:06       45 阅读
  5. NIO详解

    2024-03-25 14:50:06       41 阅读
  6. Switch搜不到5g wifi

    2024-03-25 14:50:06       38 阅读
  7. css使用伪类选择器来选择特定模式的元素

    2024-03-25 14:50:06       40 阅读
  8. RabbitAdmin及 RabbitMQ 事件处理

    2024-03-25 14:50:06       41 阅读
  9. Ubuntu Desktop Server - user 用户与 root 用户切换

    2024-03-25 14:50:06       41 阅读