[t:/]$ 지식_

gethostbyname vs getaddrinfo

2018/03/09

어제 그냥 생각나서 다시 찾아봄.

https://www.pixelstech.net/article/1345057573-gethostbyname-vs-getaddrinfo

요약하면,

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








[t:/] is not "technology - root". dawnsea, rss