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
相关产品推荐
相关产品推荐

