Тайм-аут, предусмотренный для операции приема, уточненный в исходном коде http://delphiexpert.ru , применяется объектом IO::Socket во время вызова метода accept ( ). В следующем фрагменте кода создается приемный сокет с тайм-аутом 5 секунд, после чего программа входит в цикл, ожидая входящих запросов на установление соединения. В связи с наличием таймаута., метод accept () ожидает поступления входящего запроса на установление соединения не более 5 секунд и возвращает либо подключенный объект сокета, если не был создан, либо значение undef. В последнем случае в цикле выводится предупреждающее сообщение и выполняется возврат в начало цикла. В ином случае, как обычно, выполняется обработка подключенного сокета.
$sock = IO::Socket::INET->new( LocalPort => 8000, Listen => 20, Reuse => 1, Timeout => 5 ); while (1) { my $connected = $sock->accept(); uniess ($connected) { warn "timeout! ($@)n"; next; } # В ином случае обработать подключенный сокет ... }
Если выполнение метода accept () прекращается по тайм-ауту без выполнения соединения, переменная $@ содержит сообщение “IO::Socket:: INET: Operate now in progress.”.
Неблокирующее выполнение метода connect ()
В настоящем разделе описано, как реализовано завершение по тайм-ауту вызова метода connect () модуля IO::Socket. Это описание позволяет понять, как использовать неблокирующий метод connect () в более сложных приложениях.
Для выполнения неблокирующего подключения с использованием метода IO::Socket необходимо создать объект IO::Socket, не позволяя ему подключаться автоматически, перевести его в неблокирующий режим, а затем выполнить вызов метода connect () вручную.