URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5096
[ Назад ]

Исходное сообщение
"как проверить, что сервер закрыл сокет"

Отправлено bicycle repair man , 31-Янв-06 13:37 
не могу найти в документации способа, как проверить, что уже открытый сервером сокет, через некоторое время был им закрыт.
код типа:

use IO::Socket::INET;
...
$sock = IO::Socket::INET->new(
                               PeerAddr  => $TargetHost,
                               PeerPort  => $TargetPort,
                               Proto     => 'tcp'
                              );
if( defined( $sock ) )
{
# сокет открыт
# ждем n секунд
...
#проверяем
???
}

спасибо


Содержание

Сообщения в этом обсуждении
"как проверить, что сервер закрыл сокет"
Отправлено idle , 31-Янв-06 18:32 
$sock->connected; # Если true значит connected.
http://search.cpan.org/~nwclark/perl-5.8.7/ext/IO/lib/IO/Soc...



"как проверить, что сервер закрыл сокет"
Отправлено bicycle repair man , 31-Янв-06 19:02 
>$sock->connected; # Если true значит connected.
>http://search.cpan.org/~nwclark/perl-5.8.7/ext/IO/lib/IO/Soc...

пробовал. у меня он всегда true...


"как проверить, что сервер закрыл сокет"
Отправлено rWizard , 01-Фев-06 12:41 
http://www.opennet.me/openforum/vsluhforumID9/3520.html
Учтите, если соединение не закрывается нормально, а, например, удаленный хост просто отключается от сети, то система по уполчанию реагирует на это через некотрое время

"как проверить, что сервер закрыл сокет"
Отправлено bicycle repair man , 01-Фев-06 13:14 
>http://www.opennet.me/openforum/vsluhforumID9/3520.html
>Учтите, если соединение не закрывается нормально, а, например, удаленный хост просто отключается
>от сети, то система по уполчанию реагирует на это через некотрое
>время

каким образом?

у меня еще дело усложняется тем, что клиент работает под win32, и как я понимаю SIGPIPE при записи в мертвый сокет мне там не получить.

мое решение:

$select = IO::Select->new( $socket );
@readable = $select->can_read( 0 );

сервер ничего не возвращает, так что @readable для него всегда пустой.
как только сервер закрыл соединение, то $socket становиться читаемым, и мы оттуда береи EOF.

второй способ: записать два раза в сокет, на второй раз $! не пустой, если соединения нет.