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