使用IO :: Socket :: Async处理连接失败

时间:2018-10-29 22:04:23

标签: asynchronous perl6 cro

我正在使用IO :: Socket :: Async进行一个小项目。我正在尝试编写一些测试以确保能够正确处理连接丢失,但最初的尝试没有按计划进行。我以为使用QUIT移相器是可以的,但是在我尝试关闭电源的测试中没有给出任何响应,但是没有给出我希望的结果。有人可以为我指出如何使用IO :: Socket :: Async处理连接丢失的正确方向吗?

下面是我尝试使用quit的供应示例。由于它没有按我的预期工作。我不确定我是否会正确处理此问题。

supply whenever $connection -> $event {
    if $event ~~ /event message/ {
       emit { status => $event };
    }
    QUIT {
        .note;
        say 'conection lost';
    }
}

1 个答案:

答案 0 :(得分:5)

有两种终止连接的方法:

  • EOF,我们认为这是“有序的”关闭。 whenever订阅非常像一个循环,LAST移相器在流的有序末端触发。因此,要处理这种情况,请使用LAST
  • 错误的终止,例如由对等方重置连接,将在您编写时触发QUIT(尽管实际上需要QUIT { default { note $_ } }来处理它,就像CATCH一样)。< / li>

似乎至少有 I 个案例被认为是“有序的”(即EOF案例)。例如,运行这样的服务器:

react {
    whenever IO::Socket::Async.listen('localhost', 4242) -> $conn {
        whenever $conn -> $stuff {
            $conn.print($stuff);
        }
    }
}

还有这样的客户:

my $conn = await IO::Socket::Async.connect('localhost', 4242);
react {
    whenever $conn -> $stuff {
        say "Got back $stuff";
        LAST {
            say "Connection closed";
            done;
        }
        QUIT {
            default {
                say "Connection lost: $_";
                done;
            }
        }
    }

    whenever Supply.interval(1) {
        $conn.print("hello $_\n");
    }
}

然后按Ctrl + C服务器,并且-至少在我的本地设置(VM中的Ubuntu)上,它触发了LAST。我想知道这是否可能是某种错误,因此将其追溯到VM的I / O绑定中,没有,在这种情况下,我们确实是从操作系统中将EOF传递给了我们,而不是一个错误。将服务器放置在单独的计算机上,然后断开我本地计算机上的wifi,足以触发QUIT情况,发生“对等连接重置”。

总而言之,QUIT是处理错误连接丢失的正确方法,但是LAST是由EOF触发的,在某些情况下,我们可能会考虑“连接丢失”;只有在套接字顶部说出的协议才能真正确定这是否是结束事情的意外时间。