面试题答案
一键面试- 基本步骤:
- 包含头文件:
#include <stdio.h> #include <netdb.h> #include <arpa/inet.h> #include <string.h>
- 初始化变量:定义一个
struct hostent
指针,用于存储解析结果。例如:struct hostent *host_entry;
- 调用解析函数:使用
gethostbyname
(已不推荐,因不支持IPv6)或getaddrinfo
函数进行DNS解析。例如使用gethostbyname
:host_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); } }
- 包含头文件:
- 常用函数:
- 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);
- 功能:释放由
- gethostbyname: