3 # Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
4 # This program is free software; you can redistribute it and/or
5 # modify it under the same terms as Perl itself.
7 package IO::Socket::INET;
16 @ISA = qw(IO::Socket);
19 IO::Socket::INET->register_domain( AF_INET );
21 my %socket_type = ( tcp => SOCK_STREAM,
28 unshift(@_, "PeerAddr") if @_ == 1;
29 return $class->SUPER::new(@_);
33 my($addr,$port,$proto) = @_;
38 if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
41 @proto = $proto =~ m,\D, ? getprotobyname($proto)
42 : getprotobynumber($proto);
44 $proto = $proto[2] || undef;
48 $port =~ s,\((\d+)\)$,,;
50 my $defport = $1 || undef;
51 my $pnum = ($port =~ m,^(\d+)$,)[0];
53 @serv= getservbyname($port, $proto[0] || "")
56 $port = $pnum || $serv[2] || $defport || undef;
58 $proto = (getprotobyname($serv[3]))[2] || undef
62 return ($addr || undef,
71 $@ = join("",ref($sock),": ",@_);
73 if(defined fileno($sock));
78 my($sock,$addr_str, $multi) = @_;
80 if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
81 (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
83 my $h = inet_aton($addr_str);
84 push(@addr, $h) if defined $h;
91 my($lport,$rport,$laddr,$raddr,$proto,$type);
94 $arg->{LocalAddr} = $arg->{LocalHost}
95 if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
97 ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
101 $laddr = defined $laddr ? inet_aton($laddr)
104 return _error($sock,"Bad hostname '",$arg->{LocalAddr},"'")
105 unless(defined $laddr);
107 $arg->{PeerAddr} = $arg->{PeerHost}
108 if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
110 unless(exists $arg->{Listen}) {
111 ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
116 $proto ||= (getprotobyname('tcp'))[2];
118 my $pname = (getprotobynumber($proto))[0];
119 $type = $arg->{Type} || $socket_type{$pname};
124 @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
125 return _error($sock,"Bad hostname '",$arg->{PeerAddr},"'")
131 $sock->socket(AF_INET, $type, $proto) or
132 return _error($sock,"$!");
135 $sock->sockopt(SO_REUSEADDR,1) or
136 return _error($sock,"$!");
139 if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
140 $sock->bind($lport || 0, $laddr) or
141 return _error($sock,"$!");
144 if(exists $arg->{Listen}) {
145 $sock->listen($arg->{Listen} || 5) or
146 return _error($sock,"$!");
150 # don't try to connect unless we're given a PeerAddr
151 last unless exists($arg->{PeerAddr});
153 $raddr = shift @raddr;
155 return _error($sock,'Cannot determine remote port')
156 unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
159 unless($type == SOCK_STREAM || defined $raddr);
161 return _error($sock,"Bad hostname '",$arg->{PeerAddr},"'")
162 unless defined $raddr;
164 # my $timeout = ${*$sock}{'io_socket_timeout'};
165 # my $before = time() if $timeout;
167 if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
168 # ${*$sock}{'io_socket_timeout'} = $timeout;
172 return _error($sock,"$!")
176 # my $new_timeout = $timeout - (time() - $before);
177 # return _error($sock, "Timeout") if $new_timeout <= 0;
178 # ${*$sock}{'io_socket_timeout'} = $new_timeout;
187 @_ == 2 || @_ == 3 or
188 croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
190 return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
194 @_ == 2 || @_ == 3 or
195 croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
197 return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
201 @_ == 1 or croak 'usage: $sock->sockaddr()';
203 my $name = $sock->sockname;
204 $name ? (sockaddr_in($name))[1] : undef;
208 @_ == 1 or croak 'usage: $sock->sockport()';
210 my $name = $sock->sockname;
211 $name ? (sockaddr_in($name))[0] : undef;
215 @_ == 1 or croak 'usage: $sock->sockhost()';
217 my $addr = $sock->sockaddr;
218 $addr ? inet_ntoa($addr) : undef;
222 @_ == 1 or croak 'usage: $sock->peeraddr()';
224 my $name = $sock->peername;
225 $name ? (sockaddr_in($name))[1] : undef;
229 @_ == 1 or croak 'usage: $sock->peerport()';
231 my $name = $sock->peername;
232 $name ? (sockaddr_in($name))[0] : undef;
236 @_ == 1 or croak 'usage: $sock->peerhost()';
238 my $addr = $sock->peeraddr;
239 $addr ? inet_ntoa($addr) : undef;
248 IO::Socket::INET - Object interface for AF_INET domain sockets
252 use IO::Socket::INET;
256 C<IO::Socket::INET> provides an object interface to creating and using sockets
257 in the AF_INET domain. It is built upon the L<IO::Socket> interface and
258 inherits all the methods defined by L<IO::Socket>.
266 Creates an C<IO::Socket::INET> object, which is a reference to a
267 newly created symbol (see the C<Symbol> package). C<new>
268 optionally takes arguments, these arguments are in key-value pairs.
270 In addition to the key-value pairs accepted by L<IO::Socket>,
271 C<IO::Socket::INET> provides.
274 PeerAddr Remote host address <hostname>[:<port>]
275 PeerHost Synonym for PeerAddr
276 PeerPort Remote port or service <service>[(<no>)] | <no>
277 LocalAddr Local host bind address hostname[:port]
278 LocalHost Synonym for LocalAddr
279 LocalPort Local host bind port <service>[(<no>)] | <no>
280 Proto Protocol name (or number) "tcp" | "udp" | ...
281 Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
282 Listen Queue size for listen
283 Reuse Set SO_REUSEADDR before binding
284 Timeout Timeout value for various operations
285 MultiHomed Try all adresses for multi-homed hosts
288 If C<Listen> is defined then a listen socket is created, else if the
289 socket type, which is derived from the protocol, is SOCK_STREAM then
292 Although it is not illegal, the use of C<MultiHomed> on a socket
293 which is in non-blocking mode is of little use. This is because the
294 first connect will never fail with a timeout as the connaect call
297 The C<PeerAddr> can be a hostname or the IP-address on the
298 "xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
299 service name. The service name might be followed by a number in
300 parenthesis which is used if the service is not known by the system.
301 The C<PeerPort> specification can also be embedded in the C<PeerAddr>
302 by preceding it with a ":".
304 If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
305 then the constructor will try to derive C<Proto> from the service
306 name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
307 parameter will be deduced from C<Proto> if not specified.
309 If the constructor is only passed a single argument, it is assumed to
310 be a C<PeerAddr> specification.
314 $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
315 PeerPort => 'http(80)',
318 $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
320 $sock = IO::Socket::INET->new(Listen => 5,
321 LocalAddr => 'localhost',
325 $sock = IO::Socket::INET->new('127.0.0.1:25');
328 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
330 As of VERSION 1.18 all IO::Socket objects have autoflush turned on
331 by default. This was not the case with earlier releases.
333 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
341 Return the address part of the sockaddr structure for the socket
345 Return the port number that the socket is using on the local host
349 Return the address part of the sockaddr structure for the socket in a
350 text form xx.xx.xx.xx
354 Return the address part of the sockaddr structure for the socket on
359 Return the port number for the socket on the peer host.
363 Return the address part of the sockaddr structure for the socket on the
364 peer host in a text form xx.xx.xx.xx
370 L<Socket>, L<IO::Socket>
374 Graham Barr. Currently maintained by the Perl Porters. Please report all
375 bugs to <perl5-porters@perl.org>.
379 Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
380 This program is free software; you can redistribute it and/or
381 modify it under the same terms as Perl itself.