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;
17 @ISA = qw(IO::Socket);
20 my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
22 IO::Socket::INET->register_domain( AF_INET );
24 my %socket_type = ( tcp => SOCK_STREAM,
31 unshift(@_, "PeerAddr") if @_ == 1;
32 return $class->SUPER::new(@_);
36 my($addr,$port,$proto) = @_;
42 if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
45 if (@proto = ( $proto =~ m,\D,
46 ? getprotobyname($proto)
47 : getprotobynumber($proto))
49 $proto = $proto[2] || undef;
52 $@ = "Bad protocol '$proto'";
58 $port =~ s,\((\d+)\)$,,;
60 my $defport = $1 || undef;
61 my $pnum = ($port =~ m,^(\d+)$,)[0];
63 @serv = getservbyname($port, $proto[0] || "")
66 $port = $pnum || $serv[2] || $defport || undef;
67 unless (defined $port) {
68 $@ = "Bad service '$origport'";
72 $proto = (getprotobyname($serv[3]))[2] || undef
76 return ($addr || undef,
87 $@ = join("",ref($sock),": ",@_);
89 if(defined fileno($sock));
96 my($sock,$addr_str, $multi) = @_;
98 if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
99 (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
101 my $h = inet_aton($addr_str);
102 push(@addr, $h) if defined $h;
109 my($lport,$rport,$laddr,$raddr,$proto,$type);
112 $arg->{LocalAddr} = $arg->{LocalHost}
113 if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
115 ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
118 or return _error($sock, $!, $@);
120 $laddr = defined $laddr ? inet_aton($laddr)
123 return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
124 unless(defined $laddr);
126 $arg->{PeerAddr} = $arg->{PeerHost}
127 if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
129 unless(exists $arg->{Listen}) {
130 ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
133 or return _error($sock, $!, $@);
136 $proto ||= (getprotobyname('tcp'))[2];
138 my $pname = (getprotobynumber($proto))[0];
139 $type = $arg->{Type} || $socket_type{$pname};
144 @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
145 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
151 $sock->socket(AF_INET, $type, $proto) or
152 return _error($sock, $!, "$!");
155 $sock->sockopt(SO_REUSEADDR,1) or
156 return _error($sock, $!, "$!");
159 if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
160 $sock->bind($lport || 0, $laddr) or
161 return _error($sock, $!, "$!");
164 if(exists $arg->{Listen}) {
165 $sock->listen($arg->{Listen} || 5) or
166 return _error($sock, $!, "$!");
170 # don't try to connect unless we're given a PeerAddr
171 last unless exists($arg->{PeerAddr});
173 $raddr = shift @raddr;
175 return _error($sock, $EINVAL, 'Cannot determine remote port')
176 unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
179 unless($type == SOCK_STREAM || defined $raddr);
181 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
182 unless defined $raddr;
184 # my $timeout = ${*$sock}{'io_socket_timeout'};
185 # my $before = time() if $timeout;
187 if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
188 # ${*$sock}{'io_socket_timeout'} = $timeout;
192 return _error($sock, $!, "Timeout")
196 # my $new_timeout = $timeout - (time() - $before);
197 # return _error($sock,
198 # (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
199 # "Timeout") if $new_timeout <= 0;
200 # ${*$sock}{'io_socket_timeout'} = $new_timeout;
209 @_ == 2 || @_ == 3 or
210 croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
212 return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
216 @_ == 2 || @_ == 3 or
217 croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
219 return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
223 @_ == 1 or croak 'usage: $sock->sockaddr()';
225 my $name = $sock->sockname;
226 $name ? (sockaddr_in($name))[1] : undef;
230 @_ == 1 or croak 'usage: $sock->sockport()';
232 my $name = $sock->sockname;
233 $name ? (sockaddr_in($name))[0] : undef;
237 @_ == 1 or croak 'usage: $sock->sockhost()';
239 my $addr = $sock->sockaddr;
240 $addr ? inet_ntoa($addr) : undef;
244 @_ == 1 or croak 'usage: $sock->peeraddr()';
246 my $name = $sock->peername;
247 $name ? (sockaddr_in($name))[1] : undef;
251 @_ == 1 or croak 'usage: $sock->peerport()';
253 my $name = $sock->peername;
254 $name ? (sockaddr_in($name))[0] : undef;
258 @_ == 1 or croak 'usage: $sock->peerhost()';
260 my $addr = $sock->peeraddr;
261 $addr ? inet_ntoa($addr) : undef;
270 IO::Socket::INET - Object interface for AF_INET domain sockets
274 use IO::Socket::INET;
278 C<IO::Socket::INET> provides an object interface to creating and using sockets
279 in the AF_INET domain. It is built upon the L<IO::Socket> interface and
280 inherits all the methods defined by L<IO::Socket>.
288 Creates an C<IO::Socket::INET> object, which is a reference to a
289 newly created symbol (see the C<Symbol> package). C<new>
290 optionally takes arguments, these arguments are in key-value pairs.
292 In addition to the key-value pairs accepted by L<IO::Socket>,
293 C<IO::Socket::INET> provides.
296 PeerAddr Remote host address <hostname>[:<port>]
297 PeerHost Synonym for PeerAddr
298 PeerPort Remote port or service <service>[(<no>)] | <no>
299 LocalAddr Local host bind address hostname[:port]
300 LocalHost Synonym for LocalAddr
301 LocalPort Local host bind port <service>[(<no>)] | <no>
302 Proto Protocol name (or number) "tcp" | "udp" | ...
303 Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
304 Listen Queue size for listen
305 Reuse Set SO_REUSEADDR before binding
306 Timeout Timeout value for various operations
307 MultiHomed Try all adresses for multi-homed hosts
310 If C<Listen> is defined then a listen socket is created, else if the
311 socket type, which is derived from the protocol, is SOCK_STREAM then
314 Although it is not illegal, the use of C<MultiHomed> on a socket
315 which is in non-blocking mode is of little use. This is because the
316 first connect will never fail with a timeout as the connaect call
319 The C<PeerAddr> can be a hostname or the IP-address on the
320 "xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
321 service name. The service name might be followed by a number in
322 parenthesis which is used if the service is not known by the system.
323 The C<PeerPort> specification can also be embedded in the C<PeerAddr>
324 by preceding it with a ":".
326 If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
327 then the constructor will try to derive C<Proto> from the service
328 name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
329 parameter will be deduced from C<Proto> if not specified.
331 If the constructor is only passed a single argument, it is assumed to
332 be a C<PeerAddr> specification.
336 $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
337 PeerPort => 'http(80)',
340 $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
342 $sock = IO::Socket::INET->new(Listen => 5,
343 LocalAddr => 'localhost',
347 $sock = IO::Socket::INET->new('127.0.0.1:25');
350 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
352 As of VERSION 1.18 all IO::Socket objects have autoflush turned on
353 by default. This was not the case with earlier releases.
355 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
365 Return the address part of the sockaddr structure for the socket
369 Return the port number that the socket is using on the local host
373 Return the address part of the sockaddr structure for the socket in a
374 text form xx.xx.xx.xx
378 Return the address part of the sockaddr structure for the socket on
383 Return the port number for the socket on the peer host.
387 Return the address part of the sockaddr structure for the socket on the
388 peer host in a text form xx.xx.xx.xx
394 L<Socket>, L<IO::Socket>
398 Graham Barr. Currently maintained by the Perl Porters. Please report all
399 bugs to <perl5-porters@perl.org>.
403 Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
404 This program is free software; you can redistribute it and/or
405 modify it under the same terms as Perl itself.