if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
# ${*$sock}{'io_socket_timeout'} = $timeout;
return $sock;
}
####
BEGIN {
*CORE::GLOBAL::connect = sub(*$) {
my ($socket, $name) = @_;
return CORE::connect($socket, $name) if ref($socket) eq 'IO::Socket::Foo';
$_[0] = IO::Socket::Foo->new('perlmonks.org:80') or return undef;
return 1;
}
}
package IO::Socket::Foo;
use IO::Socket::INET;
use base "IO::Socket::INET";
package main;
$SIG{PIPE} = sub { die "Broken pipe!\n" };
my $sock = IO::Socket::INET->new('perlmonks.org:80')
or die $@;
print "\$sock is: $sock\n";
$sock->syswrite("GET / HTTP/1.0\r\n");
$sock->close();
####
if (my $mysock = $sock->connect(pack_sockaddr_in($rport, $raddr))) {
print "DEBUG orig glob: $sock\n";
print "DEBUG open glob: $mysock\n";
bless $mysock, ref($sock);
print "DEBUG reblessed: $mysock\n\n";
return $mysock;
}
####
$ ./883113.pl
DEBUG orig glob: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG reblessed: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG orig glob: IO::Socket::INET=GLOB(0x992688)
DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG reblessed: IO::Socket::INET=GLOB(0x9929e8)
$sock is: IO::Socket::INET=GLOB(0x9929e8)
####
$ ./883113.pl
DEBUG orig glob: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG reblessed: IO::Socket::Foo=GLOB(0x9929e8)
DEBUG orig glob: IO::Socket::INET=GLOB(0x992688)
DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8) <---
DEBUG reblessed: IO::Socket::INET=GLOB(0x9929e8) |
|
$sock is: IO::Socket::INET=GLOB(0x992688) <--- != ---
Broken pipe!