не могу найти в документации способа, как проверить, что уже открытый сервером сокет, через некоторое время был им закрыт.
код типа:use IO::Socket::INET;
...
$sock = IO::Socket::INET->new(
PeerAddr => $TargetHost,
PeerPort => $TargetPort,
Proto => 'tcp'
);
if( defined( $sock ) )
{
# сокет открыт
# ждем n секунд
...
#проверяем
???
}спасибо
$sock->connected; # Если true значит connected.
http://search.cpan.org/~nwclark/perl-5.8.7/ext/IO/lib/IO/Soc...
>$sock->connected; # Если true значит connected.
>http://search.cpan.org/~nwclark/perl-5.8.7/ext/IO/lib/IO/Soc...пробовал. у меня он всегда true...
http://www.opennet.me/openforum/vsluhforumID9/3520.html
Учтите, если соединение не закрывается нормально, а, например, удаленный хост просто отключается от сети, то система по уполчанию реагирует на это через некотрое время
>http://www.opennet.me/openforum/vsluhforumID9/3520.html
>Учтите, если соединение не закрывается нормально, а, например, удаленный хост просто отключается
>от сети, то система по уполчанию реагирует на это через некотрое
>времякаким образом?
у меня еще дело усложняется тем, что клиент работает под win32, и как я понимаю SIGPIPE при записи в мертвый сокет мне там не получить.
мое решение:
$select = IO::Select->new( $socket );
@readable = $select->can_read( 0 );сервер ничего не возвращает, так что @readable для него всегда пустой.
как только сервер закрыл соединение, то $socket становиться читаемым, и мы оттуда береи EOF.второй способ: записать два раза в сокет, на второй раз $! не пустой, если соединения нет.