gethostbyname解析域名时的超时设置

avatar
作者
猴君
阅读量:0

gethostbyname 是一个用于将域名解析为 IP 地址的函数,但它本身并不提供超时设置

#include<stdio.h> #include <stdlib.h> #include<string.h> #include <unistd.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h>  int main(int argc, char *argv[]) {     if (argc != 2) {         printf("Usage: %s<domain_name>\n", argv[0]);         exit(1);     }      const char *domain_name = argv[1];     struct hostent *host;     struct in_addr **addr_list;     int i;      // 使用 gethostbyname 解析域名     host = gethostbyname(domain_name);     if (host == NULL) {         printf("Error: %s\n", hstrerror(h_errno));         return 1;     }      addr_list = (struct in_addr **)host->h_addr_list;     for (i = 0; addr_list[i] != NULL; i++) {         printf("%s\n", inet_ntoa(*addr_list[i]));     }      return 0; } 

要实现超时设置,可以考虑使用其他库,如 c-areslibuv。这些库提供了异步 DNS 解析功能,支持超时设置。例如,使用 c-ares 库实现带有超时设置的域名解析:

#include <ares.h> #include<stdio.h> #include <stdlib.h> #include<string.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/socket.h>  static void callback(void *arg, int status, int timeouts, struct hostent *host) {     if (status != ARES_SUCCESS) {         printf("Error: %s\n", ares_strerror(status));         return;     }      struct in_addr **addr_list = (struct in_addr **)host->h_addr_list;     for (int i = 0; addr_list[i] != NULL; i++) {         printf("%s\n", inet_ntoa(*addr_list[i]));     } }  int main(int argc, char *argv[]) {     if (argc != 2) {         printf("Usage: %s<domain_name>\n", argv[0]);         exit(1);     }      const char *domain_name = argv[1];     ares_channel channel;     int status;      // 初始化 c-ares 库     status = ares_init(&channel);     if (status != ARES_SUCCESS) {         printf("Error: %s\n", ares_strerror(status));         return 1;     }      // 设置查询超时时间(单位:毫秒)     ares_set_timeout(channel, 5000);      // 异步解析域名     ares_gethostbyname(channel, domain_name, AF_INET, callback, NULL);      // 等待查询完成     for (;;) {         fd_set read_fds, write_fds;         int nfds;         struct timeval *tvp, tv;          FD_ZERO(&read_fds);         FD_ZERO(&write_fds);         nfds = ares_fds(channel, &read_fds, &write_fds);         if (nfds == 0) {             break;         }          tvp = ares_timeout(channel, NULL, &tv);         select(nfds, &read_fds, &write_fds, NULL, tvp);         ares_process(channel, &read_fds, &write_fds);     }      // 销毁 c-ares 库     ares_destroy(channel);      return 0; } 

在这个示例中,我们使用 ares_set_timeout 函数设置查询超时时间。请注意,这个示例需要安装 c-ares 库。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!