Perl6 IO :: Socket :: Асинхронный сервер умирает с исключением: сброс соединения по пиру

Вот код эхо-сервера:

#!/usr/bin/env perl6
my $port = 3333 ;
say "listen port $port" ;

react {
    my $ids = 0 ;
    whenever IO::Socket::Async.listen('0.0.0.0', $port ) -> $conn {
        my $id = $ids++ ;
        $conn.print( "$id: hello\n") ;
        whenever $conn.Supply.lines -> $line {
            say "$id: $line" ;
            $conn.print( "$id : $line\n") ;
        }
    }
}

вот код клиента:

#!/usr/bin/env perl6
my $port = 3333 ;
my $conn = await IO::Socket::Async.connect('localhost', $port );
$conn.print: "{time}\n";

#$conn.Supply.tap(-> $v { print $v });

sleep 1 ;
$conn.close;

Когда клиентское соединение не получает никаких данных с сервера, затем закрывает соединение, на котором сервер умирает с этой ошибкой:

listen port 3333
0: 1524671069
An operation first awaited:
  in block <unit> at ./server2.p6 line 5

Died with the exception:
    connection reset by peer
      in block <unit> at ./server2.p6 line 5

X::AdHoc+{X::Await::Died}: connection reset by peer

Как изящно ловить сетевые ошибки, чтобы сервер был более устойчивым?

7 голосов | спросил Ken Town 25 PMpWed, 25 Apr 2018 18:52:53 +030052Wednesday 2018, 18:52:53

1 ответ


0

Если вы хотите обработать случай, когда Supply (или любой другой, например, Promise), лежащий в основе whenever, выходит (или когда Promise не работает), вы можете установить обработчик QUIT внутри всякий раз, когда. Он работает так же, как обработчик исключений, поэтому он захочет, чтобы вы либо сопоставили исключение как-то, либо просто default, если хотите все причины прекращения как "хорошо".

whenever $conn.Supply.lines -> $line {
    say "$id: $line" ;
    $conn.print( "$id : $line\n") ;
    QUIT {
        default {
            say "oh no, $_";
        }
    }
}

Это выведет «о нет, сброс соединения по пиру» и продолжит работу.

ответил timotimo 25 PMpWed, 25 Apr 2018 22:37:52 +030037Wednesday 2018, 22:37:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132