This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
proposal [perl #34301]: IO::Socket calls getpeername far too often
authorPeter Dintelmann <Peter.Dintelmann@Dresdner-Bank.com>
Thu, 2 Jun 2005 13:34:49 +0000 (15:34 +0200)
committerSteve Peters <steve@fisharerojo.org>
Wed, 5 Oct 2005 18:20:54 +0000 (18:20 +0000)
Message-ID: <E9A2605289D8D7468B1A21EC24E59D2101852447@naimucx5.muc.allianz>

p4raw-id: //depot/perl@25697

ext/IO/lib/IO/Socket.pm
ext/IO/lib/IO/Socket/INET.pm

index 4429f2b..46504db 100644 (file)
@@ -23,7 +23,7 @@ require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');
 
 @ISA = qw(IO::Handle);
 
-$VERSION = "1.29";
+$VERSION = "1.29_01";
 
 @EXPORT_OK = qw(sockatmark);
 
@@ -141,6 +141,13 @@ sub connect {
     $err ? undef : $sock;
 }
 
+sub close {
+    @_ == 1 or croak 'usage: $sock->close()';
+    my $sock = shift;
+    ${*$sock}{'io_socket_peername'} = undef;
+    $sock->SUPER::close();
+}
+
 sub bind {
     @_ == 2 or croak 'usage: $sock->bind(NAME)';
     my $sock = shift;
@@ -195,9 +202,7 @@ sub sockname {
 sub peername {
     @_ == 1 or croak 'usage: $sock->peername()';
     my($sock) = @_;
-    getpeername($sock)
-      || ${*$sock}{'io_socket_peername'}
-      || undef;
+    ${*$sock}{'io_socket_peername'} ||= getpeername($sock);
 }
 
 sub connected {
@@ -239,6 +244,7 @@ sub recv {
 sub shutdown {
     @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
     my($sock, $how) = @_;
+    ${*$sock}{'io_socket_peername'} = undef;
     shutdown($sock, $how);
 }
 
index 96b4991..7d2d538 100644 (file)
@@ -15,7 +15,7 @@ use Exporter;
 use Errno;
 
 @ISA = qw(IO::Socket);
-$VERSION = "1.29";
+$VERSION = "1.29_01";
 
 my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
 
@@ -81,7 +81,7 @@ sub _error {
       local($!);
       my $title = ref($sock).": ";
       $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_);
-      close($sock)
+      $sock->close()
        if(defined fileno($sock));
     }
     $! = $err;