MST

星途 面试题库

面试题:C语言中实现简单DNS解析的基本步骤

请简述在Linux环境下,使用C语言进行简单DNS解析的基本步骤,并说明常用的函数有哪些。
18.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 包含头文件
      #include <stdio.h>
      #include <netdb.h>
      #include <arpa/inet.h>
      #include <string.h>
      
    • 初始化变量:定义一个struct hostent指针,用于存储解析结果。例如:struct hostent *host_entry;
    • 调用解析函数:使用gethostbyname(已不推荐,因不支持IPv6)或getaddrinfo函数进行DNS解析。例如使用gethostbynamehost_entry = gethostbyname("example.com");
    • 检查解析结果:检查返回的指针是否为NULL,如果是NULL,则解析失败。
    • 处理解析结果:如果解析成功,从struct hostent结构体中提取相关信息,如IP地址等。例如:
      if (host_entry!= NULL) {
          char **alias_list = host_entry->h_aliases;
          while (*alias_list!= NULL) {
              printf("Alias: %s\n", *alias_list);
              alias_list++;
          }
          struct in_addr **addr_list = (struct in_addr **)host_entry->h_addr_list;
          for (int i = 0; addr_list[i]!= NULL; i++) {
              char ip[INET_ADDRSTRLEN];
              inet_ntop(AF_INET, addr_list[i], ip, INET_ADDRSTRLEN);
              printf("IP Address: %s\n", ip);
          }
      }
      
  2. 常用函数
    • gethostbyname
      • 功能:根据主机名获取主机信息。不支持IPv6,已逐渐被弃用。
      • 原型struct hostent *gethostbyname(const char *name);
    • gethostbyaddr
      • 功能:根据IP地址获取主机信息。同样不支持IPv6,已逐渐被弃用。
      • 原型struct hostent *gethostbyaddr(const char *addr, socklen_t len, int type);
    • getaddrinfo
      • 功能:将主机名或服务名转换为套接字地址结构。支持IPv4和IPv6。
      • 原型int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
    • freeaddrinfo
      • 功能:释放由getaddrinfo分配的内存。
      • 原型void freeaddrinfo(struct addrinfo *res);