어제 그냥 생각나서 다시 찾아봄.
요약하면,
getaddrinfo 가 gethostbyname 보다 훨씬 느리다. 이유는 얘가 dns를 10번이나 찔른다고 strace 까봤다고 함.
하지만 gethostbyname 은 ipv6를 지원하지 않는 구식 방법이라고 함.
이 함수 둘 다 블로킹이다. C-ares library를 쓰면 비동기로 처리할 수 있다고 함. 이건 나도 안 써봄.
글에서 말하고 있는 것은 gethostbyname2를 두 번 쓰라는 것이다.
소스를 옮겨다 놓는다.
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define HOST "cet.99sushe.com"
void print_time(const char *tip, const struct timeval *begin, const struct timeval *end)
{
long diff = (end->tv_sec - begin->tv_sec) * 1000000 +
(end->tv_usec - begin->tv_usec);
printf("%s: %ld.%ld\n", tip, diff / 1000000, diff % 10000);
}
int main(int argc, char *argv[])
{
struct timeval begin;
struct timeval end;
if (argc == 2 && strcmp(argv[1], "getaddrinfo") == 0) {
struct addrinfo *ai;
struct addrinfo hints;
memset(&hints, 0x00, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_NUMERICSERV;
gettimeofday(&begin, 0);
getaddrinfo(HOST, "80", &hints, &ai);
gettimeofday(&end, 0);
print_time("getaddrinfo", &begin, &end);
}
if (argc == 2 && strcmp(argv[1], "gethostbyname") == 0) {
gettimeofday(&begin, 0);
gethostbyname2(HOST, AF_INET);
gethostbyname2(HOST, AF_INET6);
gettimeofday(&end, 0);
print_time("gethostbyname", &begin, &end);
}
return 0;
}
Reference : http://gcoder.blogbus.com/logs/158890083.html