我通过不同线程的 gethostbyname() 进行了 DNS 解析实验。我关闭了网络链接并在下面运行程序。输出是这样的
gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 完成于 1411234774 gethostbyname 完成于 1411234814 gethostbyname 完成于 1411234854
gethostbyname() 同时开始,但在 40 秒超时后一一结束。
然后我用 getaddrinfo() 进行了实验。看起来这个函数没有这个问题
getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799
那么,为什么我得到了这个结果,并且这种行为仅适用于 Linux 吗?
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
void *resolve_ghbn(void *host) {
printf("gethostbyname started at %d\n", time(NULL));
struct hostent *rslv = gethostbyname((char*)host);
printf("gethostbyname finished at %d\n", time(NULL));
return NULL;
}
void *resolve_gai(void *host) {
struct addrinfo *result;
printf("getaddrinfo started at %d\n", time(NULL));
int res = getaddrinfo(host, NULL, NULL, &result);
printf("getaddrinfo finished at %d\n", time(NULL));
if (res == 0)
freeaddrinfo(result);
return NULL;
}
int main() {
char *domains[] = {"google.com", "google.cy", "google.us"};
pthread_t threads[3];
int i;
for (i=0; i<3; i++) {
pthread_create(&threads[i], NULL, resolve_ghbn, domains[i]);
}
void *retval;
for (i=0; i<3; i++) {
pthread_join(threads[i], &retval);
}
return 0;
}