1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Виснет на $sock->recv. Perl под Windows.

Тема в разделе "Web - программирование", создана пользователем DenisPerm, 27 июн 2008.

  1. DenisPerm

    DenisPerm New Member

    Репутация:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    2
    Симпатии:
    0
    Не работает вот такая конструкция:

    eval{
    local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
    alarm($TIMEOUT);
    $sock->recv($data,960) or die "recv() failed: $!\n";
    alarm(0)
    };

    Если идет обращение к несуществующему хосту, то виснет на $sock->recv.
    Если ответ от хоста есть, то все нормально.

    В чем дело и как правильно это реализуется ?
     
  2. Vovochka

    Vovochka Гость

    Репутация:
    0
  3. DenisPerm

    DenisPerm New Member

    Репутация:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    2
    Симпатии:
    0
    Нее. Винда точно XP.
    Да и сама конструкция alarm работает.
    Т. е. если $sock->recv заменить на sleep,
    то alarm через TIMEOUT работает.

    Виснет именно $sock->recv.

    И я ХЗ что с этим делать.
    Самый смех, что текст их модуля Net-NTP.
    И модулю то 300 лет.
     
  4. Vovochka

    Vovochka Гость

    Репутация:
    0
    Хех :)
    Может вместо эвала попробовать в поток обернуть?
    Хотя вряд ли оно того стоит.
     
  5. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    Слабо представляю что делает ваш код на Перле, но все же...
    В MSDN (Winsocks v.2) по поводу recv сказано:
    Т.е. будет висеть пока не пойдут данные.
     
  6. Vovochka

    Vovochka Гость

    Репутация:
    0
    В том то и прикол. Этот хак (код) помогает избавиться от блокировки:
    Код:
    local $SIG{ALRM} = sub { die "Net::NTP timed out geting NTP packet\n"; };
    Присваиваем обработчик для сигнала SIGALART
    С этим обработчиком при получении сигнала программа должна "умереть", но так как этот участок кода завернут в eval, то просто мы выпадем из этого блока.
    Код:
    alarm($TIMEOUT);
    Заказываем SIGALARM через $TIMEOUT сек.
    Код:
    $sock->recv($data,960) or die "recv() failed: $!\n";
    Блокирующий вызов.
    Код:
    alarm(0);
    Мы не выпали из блока, значит блокирующий вызов завершился. Отказываемся от заказа на SIGALARM
    Вот такая вот ботва :)
     
  7. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    Спасибо, что пояснили...Я же говорил, что:
     
Загрузка...

Поделиться этой страницей