Perl对哈希尝试的只读值的修改

时间:2018-01-17 11:35:47

标签: perl hash

我有一台服务器,它还可以计算一分钟内连接的不同IP的数量。我在下面的代码中的标记行中得到“尝试修改只读值”:

$lsock=new IO::Socket::INET(LocalPort=>$port,Proto=>'tcp',Listen=>1,Reuse=>1);
$clients={};
while (1) {
    $sock=$lsock->accept();
    if ($sock) {
        $clients->{$sock->peerhost()}=1; # THIS LINE !!!
        ...
    }
}

# then later from an alarm signal I do:
sub save_stats {
    my $cnt=scalar keys %$clients;
    $clients={};
    ...
}

错误很少出现,每月一次或更少,但这让我感到疯狂,有人可以向我解释为什么以及我该怎么办?

1 个答案:

答案 0 :(得分:0)

经过大量调查,我找到了答案。可能会发生accept()和peerhost()之间的连接丢失。在这种情况下,peeerhost()函数的返回值不适合作为哈希键。如果peerhost()返回“ false”,则完全忽略连接,解决方案非常简单。