I'm afraid I don't have any easy way to recreate it, other than throwing a lot of clients at it. It's perl 5.8.4 running under Linux 2.6.8. If I use the list form of accept, I get back the peer address correctly. Here's some debugging code:
foreach my $socket (@ready)
{
print STDERR "Start accept\n";
my ($connect, $paddr) = $socket->accept();
my ($port, $iaddr) = sockaddr_in($paddr);
print STDERR "Peer: ", inet_ntoa($iaddr), ":$port\n";
if ($connect)
{
if (!$connect->peerhost())
{
cluck("NULL PEERHOST: " . join(" : ",
$connect->sockhost(),
$connect->sockport(),
$connect->peerhost(),
$connect->peerport(),
$!
));
close($connect);
print STDERR "End accept (no peerhost)
+\n";
next;
}
$CLIENTS->add($connect);
print STDERR "End accept (success)\n";
next;
}
print STDERR "End accept (no connect)\n";
}
Output looks like this:
Start accept
Peer: X.X.X.X:15627
NULL PEERHOST: Y.Y.Y.Y : 1235 : : : Transport endpoint is not connected at ./foo.pl line 115
End accept (no peerhost)
Where X.X.X.X is the client ip and Y.Y.Y.Y is my server ip. Perhaps this is an IO::Socket::INET bug?
On a related note, I'm also getting segfaults from perl under heavy load (~2500+ clients). The segfaults don't seem to be related to the null peerhosts. I believe they're occuring on syswrite() calls when I'm sending text back to the clients.
|