You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl6 IO::Socket::INET报错Connection reset by peer问题求助

解决Perl6 IO::Socket::INET "Connection reset by peer" 错误

这个错误的根源在于客户端和服务端的套接字交互逻辑不匹配,导致连接被意外终止时服务端未正确处理。下面拆解原因和对应的修复方案:

错误原因

  • 客户端侧问题:你的客户端发送数据后,没有读取服务端的echo响应就直接关闭了套接字。当客户端主动关闭连接时,服务端的套接字处于半关闭状态,此时服务端继续调用recv尝试读取数据,就会触发"Connection reset by peer"的错误。
  • 服务端侧问题:服务端的代码没有处理连接被客户端主动关闭的异常情况,recv方法在连接意外终止时会抛出异常,而不是返回空值来结束循环。

修复方案

方案1:修复客户端逻辑,完成完整的请求-响应流程

如果你的业务场景是需要服务端echo数据,那么客户端应该接收完服务端的响应后再关闭连接,取消注释say $c.recv;即可:

#!/usr/bin/env perl6
my $c = IO::Socket::INET.new(:host<localhost>, :port(3333));
my $msg = "{time}\n";
$c.print: $msg;
# 接收服务端的echo响应
my $response = $c.recv;
say "收到服务端响应: $response";
$c.close ;

这样客户端和服务端会完成完整的交互,服务端的recv会在客户端正常关闭连接时返回空值,循环正常结束,不会触发错误。

方案2:修改服务端,捕获连接异常

如果允许客户端主动关闭连接(比如某些场景下客户端不需要等待响应),服务端需要捕获recv抛出的IO异常,避免程序崩溃:

#!/usr/bin/env perl6
my $listen = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport(3333));
loop {
    my $conn = $listen.accept;
    try {
        while my $buf = $conn.recv(:bin) {
            $conn.write: $buf;
        }
        CATCH {
            when X::IO::Socket {
                say "客户端连接已主动关闭,错误信息: {.message}";
                # 可以在这里添加清理逻辑
            }
        }
    }
    $conn.close;
}

通过try/CATCH块捕获X::IO::Socket类型的异常,服务端就能友好处理客户端主动关闭连接的情况,不会因为错误而终止运行。

内容的提问来源于stack exchange,提问作者Ken Town

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:34:12