【问题标题】:perl6 IO::Socket::INET Could not receive data from socket: Connection reset by peerperl6 IO::Socket::INET 无法从套接字接收数据:对等方重置连接
【发布时间】:2018-04-25 22:48:53
【问题描述】:

示例服务器:

#!/usr/bin/env perl6
my $listen = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport(3333));
loop {
    my $conn = $listen.accept;
    while my $buf = $conn.recv(:bin) {
        $conn.write: $buf;
    }
    $conn.close;
}

客户:

#!/use/bin/env perl6
my $c = IO::Socket::INET.new(:host<localhost>, :port(3333));
$c.print: "{time}\n";
#say $c.recv; #commented out on purpose
sleep 1 ;
$c.close ;

服务器错误:

Could not receive data from socket: Connection reset by peer in block <unit> at server4.p6 line 5

在每个块的服务器上,我尝试了CATCHQUIT。我应该如何捕捉到这个错误?

【问题讨论】:

  • 更好的是,您应该通过不写入对等方未读取的数据或相反地通过读取正在发送的所有数据来防止它。
  • 理论上是的,但是对于服务器代码不应该在客户端行为不端时崩溃。我认为如果网络在会话中间掉线也会发生这种情况。
  • 基本上是the code from the example in docs。如果它使服务器崩溃,那么肯定有问题。

标签: sockets raku


【解决方案1】:

服务器需要在循环块中捕获错误:

#!/usr/bin/env perl6
my $listen = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport(3333));
loop {
    my $conn = $listen.accept;
    while my $buf = $conn.get {
        $conn.print: $buf;
    }
    $conn.close;
    CATCH { default { say .^name, ': ', .Str ,  " handled in $?LINE";}}
}

服务器的输出报告错误并保持运行以接受新连接:

perl6 --ll-exception server.p6
X::AdHoc: Could not receive data from socket: Connection reset by peer handled in 9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多