connect() в перле (слишком долго пытается приконнектится)

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

Аватара пользователя
povert.org
Сообщения: 43

connect() в перле

Сообщение povert.org »

У меня система мониторинга. Есть хост или нет его. Если хост есть нужно от него получить информацию (везде стоят мои клиенты и серверы на перл). Вот я и делаю connect(), и если програмка не запущена на сервере и/или порт закрыт connect() пытается доооолго перед тем как сдаться.

Вопрос: как установить таймаут для connect(), чтоб не пытался долго????
Slackware Linux 10.1 on Dell latitude c600 pIII-1Ghz (laptop) && Slackware Linux 10.0 on AMD 2000+ (table PC) -- more on povert.org Днепропетровск, Украина

+ webcam !!!!
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: connect() в перле

Сообщение v04bvs »

Можно попытаться установить неблокирующий режим для дескриптора перед вызовом connect.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: connect() в перле

Сообщение madskull »

Эх, давненько я с сокетами напрямую не работал. Даже уже и не помню, что там к чему.

"В лоб" я бы решил проблему с помощью прерывания по времени.

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

eval {
    $SIG{ALRM} = sub { die "alarm\n" };
    alarm 10;
    # ... code
};
if ( $@ eq "alarm\n" ) {
    print "время вышло!\n";
}
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
povert.org
Сообщения: 43

Re: connect() в перле

Сообщение povert.org »

про alarm я сразу и подумал, но хотелось чего-то более корректного. А вот неблокирующий режим я не учел, это интересно... там fcntl помоему... Ну а насчет чего-то типа установки параметра сокету, я таймаут не нашел...

Спасибо за советы. Может еще какие идеи?
Slackware Linux 10.1 on Dell latitude c600 pIII-1Ghz (laptop) && Slackware Linux 10.0 on AMD 2000+ (table PC) -- more on povert.org Днепропетровск, Украина

+ webcam !!!!
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: connect() в перле

Сообщение Shura »

Глянь на setsockopt().
Я точно помню, что делал, но как чейчас не помню. Приду домой-посмотрю.
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: connect() в перле

Сообщение flook »

Неблокирующий коннект делается так:
1. ставим nonblock на сокет
2. зовем connect
3. потом зовем select
4. getsockopt проверяем законнектились ли
точные флаги/аргументы не помню :)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали: