Arhn - архитектура программирования

Разрешение хоста Perl для IP

Я хочу преобразовать имя хоста в IP-адрес, с которым все в порядке, используя Socket со следующим:

$ip = gethostbyname($host) or die "Can't resolve ip for $host.\n";
$ip = inet_ntoa(inet_aton($host));

Это работает нормально, пока не встретится имя хоста, которое больше не разрешается в IP, и код просто остановится. Как я могу заставить свой скрипт продолжать обработку оставшихся IP-адресов имен хостов, которые должны быть разрешены. В идеале я бы просто установил переменную $ip равной "".

Я пробовал даже без команды die, и код все равно останавливается, когда не может преобразовать имя в ip.

14.06.2017

  • Попробуйте с eval 14.06.2017

Ответы:


1

Тайм-аут gethostbyname очень и очень длинный. Я предполагаю, что вы убьете программу, прежде чем увидите, что она просто занимает много времени. Кажется, вам действительно нужно сократить время ожидания.

Вы можете настроить собственный таймер с помощью будильника. Когда он отключается, процессу доставляется сигнал SIGALRM, который по умолчанию завершает его. Итак, мы настроили обработчик для этого сигнала, в котором выдается die, тем самым превратив его в исключение. Это eval-ed, и мы возвращаем себе управление.

eval {
    local $SIG{ALRM} = sub { die "Timed out" };

    alarm 5;  # or what you find most suitable

    # your code that may need a timeout

    alarm 0;
};
if ($@ and $@ !~ /Timed out/) { die }  # re-raise if it was something else

if ($@ and $@ =~ /Timed out/) {  # test
    print "We timed out\n";
}

Если ваш код завершается менее чем за 5 секунд, мы получаем alarm 0;, что отменяет предыдущую тревогу и программа продолжается. В противном случае SIGALRM испускается, но обрабатывается и превращается в die, который является eval-ed, и поэтому весь сигнал перехватывается, и управление падает сразу после блока. Мы проверяем, действительно ли die было вызвано нашей тревогой, и если нет, мы повторно поднимаем его.

Также см. эту публикацию, чтобы получить дополнительные комментарии, и, пожалуйста, найдите дополнительные.


  Функциональность Timeout, существующая в модуле IO::Socket, предназначена для подключения, а не для поиска DNS, который здесь является виновником. Спасибо Штеффену Ульриху за комментарий.

14.06.2017
  • Тайм-аут в IO::Socket::* предназначен только для активности сокета, т.е. подключения. Он не включает поиск DNS, который блокируется с помощью gethostbyname или gethostbyaddr. 14.06.2017
  • @SteffenUllrich Спасибо! Я где-то это видел, но не был уверен. Отредактировано в пост. 14.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..