我對來自不同線程的gethostbyname()進行了DNS解析實驗。我關閉了網絡鏈接並在下面運行程序。和輸出是這樣gethostbyname()進程甚至從不同線程處理一致解析?
gethostbyname started at 1411234734 gethostbyname started at 1411234734 gethostbyname started at 1411234734 gethostbyname finished at 1411234774 gethostbyname finished at 1411234814 gethostbyname finished at 1411234854
的gethostbyname()開始在同一時間,而是由一個具有40秒超時完成一個。
然後,我使用getaddrinfo()進行了訓練。它看起來像此函數不存在這種問題
getaddrinfo started at 1411235759 getaddrinfo started at 1411235759 getaddrinfo started at 1411235759 getaddrinfo finished at 1411235799 getaddrinfo finished at 1411235799 getaddrinfo finished at 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;
}
使用'getaddrinfo()'或使用全局互斥鎖。行爲有什麼不同,我發現這兩種情況都有40秒超時,以及如何關閉網絡鏈接以及如何檢查它是否已關閉? – 2014-09-20 18:20:19
嘿,我現在看到它。我會準備一個答案。 – 2014-09-20 18:28:12