Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Виснет на $sock->recv. Perl под Windows.
Форум программистов > Интернет и сети > Web-программирование > Perl программирование
DenisPerm
Не работает вот такая конструкция:

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.
Если ответ от хоста есть, то все нормально.

В чем дело и как правильно это реализуется ?
Vovochka
]]>У вас точно не windows 2003?]]>
Хотя тема старая, но кто знает....
DenisPerm
Нее. Винда точно XP.
Да и сама конструкция alarm работает.
Т. е. если $sock->recv заменить на sleep,
то alarm через TIMEOUT работает.

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

И я ХЗ что с этим делать.
Самый смех, что текст их модуля Net-NTP.
И модулю то 300 лет.
Vovochka
Хех smile.gif
Может вместо эвала попробовать в поток обернуть?
Хотя вряд ли оно того стоит.
European
Слабо представляю что делает ваш код на Перле, но все же...
В MSDN (Winsocks v.2) по поводу recv сказано:
Цитата
If no incoming data is available at the socket, the recv call blocks and waits for data

Т.е. будет висеть пока не пойдут данные.
Vovochka
В том то и прикол. Этот хак (код) помогает избавиться от блокировки:
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
Вот такая вот ботва smile.gif
European
Цитата(Vovochka @ 1:07:2008 - 00:30) *
Этот хак (код) помогает избавиться от блокировки

Спасибо, что пояснили...Я же говорил, что:
Цитата(European @ 30:06:2008 - 14:02) *
Слабо представляю что делает ваш код на Перле
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.