gpt4 book ai didi

perl - 如何进行正确的 IO::Select 错误处理?

转载 作者:行者123 更新时间:2023-12-04 21:50:55 24 4
gpt4 key购买 nike

我正在浏览文档和如何在网络套接字通信方面正确使用 IO::Select 的方法。我想我已经把大部分事情都包起来了。

但是,我对正确的错误处理仍然有些模糊。假设我在对象中运行了类似于以下代码的内容。是的,我确实意识到它很困惑,我应该将 IO::Select 集成到对象中而不是套接字 fh 本身,我不应该每次通过循环重新创建 IO::Select,我正在迭代什么只能永远是单个返回的文件句柄等。但是,这使示例保持简单。

这只是一个连接到服务器的客户端,但我希望能够正确处理网络级别的错误,例如丢包。

编辑:$self->sock()只返回一个打开的 IO::Socket::INET 套接字。

sub read {
my $self = shift;
my($length) = @_; ### Number of bytes to read from the socket

my $ret;

while (length($ret) < $length) {
my $str;

use IO::Select;
my $sel = IO::Select->new($self->sock());

if (my @ready = $sel->can_read(5)) { ### 5 sec timeout
for my $fh (@ready) {
my $recv_ret = $fh->recv($str, $length - length($ret));
if (!defined $recv_ret) {
MyApp::Exception->throw(
message => "connection closed by remote host: $!",
);
}
}
}
else {
### Nothing ready... we timed out!
MyApp::Exception->throw(
message => "no response from remote host",
);
}
$ret .= $str;
}

return $ret;
}
  • 我是否需要检查 recv 的返回值,还是会影响它的错误显示在 IO::Select 对象中?
  • 我是否正确处理超时,或者我的逻辑设置错误?
  • IO::Socket 提到了套接字文件句柄上存在的异常,用于带外错误和其他问题。如果超时,我应该检查这个吗?如何?或者忽略不重要并且可以?
  • 为了正确的行为,我还应该处理任何其他异常情况吗?
  • 最佳答案

    1)我会检查以防万一。说到 select(2),defensive programming是你的 friend 。

    2) 假设您需要 2048 个字节并且远程主机每 5 秒发送一个字节。您刚刚挂了 10K 秒 = 3 小时。那是你要的吗?

    我会用 alarm 5$SIG{ALRM} = sub {$stop = 1;}反而。

    3 和 4) 根据我的经验,只是 read() while select()做这项工作,但我不能在这里给出肯定的答案。

    关于perl - 如何进行正确的 IO::Select 错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4811231/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com