我有一台服务器,它还可以计算一分钟内连接的不同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={};
...
}
错误很少出现,每月一次或更少,但这让我感到疯狂,有人可以向我解释为什么以及我该怎么办?
答案 0 :(得分:0)
经过大量调查,我找到了答案。可能会发生accept()和peerhost()之间的连接丢失。在这种情况下,peeerhost()函数的返回值不适合作为哈希键。如果peerhost()返回“ false”,则完全忽略连接,解决方案非常简单。