Perl nonblocking socket - perl, sockets

Я хочу використовувати неблокуюче сокет з'єднання, алене може знайти ніяких прикладів для розуміння основної ідеї. Мені потрібен клієнт, який не блокуватиме виконання програми, коли він підключається до сервера. Тепер я маю наступний код:

use IO::Socket;
use IO::Select;
use strict;
$|=1;
my $host="10.0.0.12";
my $SELECT = new IO::Select;
print "Connecting...";
my $sock=new IO::Socket::INET (
PeerAddr => $host,
PeerPort => 3128,
Proto => "tcp",
Blocking => 0);
if(!$sock)
{
print "Could not create socket: $!n";
}
#print "okn";
$SELECT->add($sock);
my $buf;
while (1){
if($sock and $sock->connected())
{
print "okn";
}
while (my @ready=$SELECT->can_read(0.5))
{
foreach my $child (@ready)
{
if(!sysread($child, $buf, 256))
{
$SELECT->remove($child);
next;
}

}
}
sleep 1;
}

Коли роз'єм підключається, $ sock-> connected () повертає істину, і я можу щось зробити. Але як перевірити сокет для тайм-ауту? Якщо він не може підключитися до таймеру, я не можу перевірити це! Як це зробити?

Додано: О Я бачу! Шматок коду

if(!sysread($child, $buf, 256))
{
$SELECT->remove($child);
next;
}

закриває розетку після закінчення тайм-ауту!

Відповіді:

1 для відповіді № 1

У контексті розеток, "блокування" має зробитиз читанням / написанням операцій на гнізді, а не підключення. Ви зацікавлені в налаштуванні тайм-ауту на з'єднуванні сокетів, яке зазвичай можна виконувати за допомогою a

Timeout => $max_seconds_to_wait

параметр у IO::Socket конструктор