Время выполнения gethostbyname (определённо виснет при запросе к DNS :()

Модератор: Модераторы разделов

Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Время выполнения gethostbyname

Сообщение korisk »

Здравствуйте.
Как я понимаю, если имени, передаваемо функции нет в хостах, то он обращается к DNS.
Компьютер подключён к интернету.
Соответственно, время ответа , что такого имени не существует оч большое.

Подскажите пожалуйста, как бы это время сократить?

Спасибо

.. gethostbyname(char *) в C
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Время выполнения gethostbyname

Сообщение AestheteAnimus »

Во-первых, насколько я знаю, вместо функции gethostbyname рекомендуется использовать getaddrinfo. Хочется сразу прокричать, используйте таймауты! Но ни та, нт другая не имеют оного в качестве параметра. К тому же, обе они не являются системными вызовами, так что не будут прерываться сигналами непосредственно. Тем не менее, при помощи sigsetjmp/siglongjmp можно добиться желаемого эффекта.

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>

static sigjmp_buf jmpbuf;

void sigalrm(int signo)
{
    siglongjmp(jmpbuf, 1);
    return;
}

int main(int argc, char** argv)
{
    struct addrinfo *result = NULL;

    char *hostname = argv[1];
    char *service = argv[2];
    int nsec = atoi(argv[3]); // Таймаут в секундах

    signal(SIGALRM, sigalrm);
    alarm(nsec);

    if (sigsetjmp(jmpbuf, 1) != 0)
    {
        // пришли сюда по сигналу
        printf("Timeouted\n");
        return 0;
    }

    if (!getaddrinfo(hostname, service, NULL, &result))
        printf("OK\n");

    alarm(0);
    signal(SIGALRM, SIG_IGN);

    return 0;
}


Собственно, вот результат работы (хост, сервис, таймаут).
Когда все ресолвится:

Код: Выделить всё

$ time ./testproj google.com domain 5
OK

real    0m0.007s
user    0m0.001s
sys     0m0.003s

и когда нет:

Код: Выделить всё

$ time ./testproj googl.com domain 5
Timeouted

real    0m5.004s
user    0m0.002s
sys     0m0.003s
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: Время выполнения gethostbyname

Сообщение korisk »

Собственно, вот результат работы (хост, сервис, таймаут).
Когда все ресолвится:

Спасибо,
Здорово, конечно, но у меня эта функция используоется в мультитредовой програмке, поэтому с сигналами связываться не хотелось бы.

С уважением.
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали: