다른 스레드에서 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 초의 시간 초과가 발생하며 네트워크 링크를 끄는 방법과 해제 된 방법을 확인하는 방법이 있습니까? –
이봐, 이제 알 겠어. 나는 대답을 준비 할 것이다. –