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) = @_;
41 if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
44 if (@proto = ( $proto =~ m,\D,
45 ? getprotobyname($proto)
46 : getprotobynumber($proto))
48 $proto = $proto[2] || undef;
51 $@ = "Bad protocol '$proto'";
57 $port =~ s,\((\d+)\)$,,;
59 my $defport = $1 || undef;
60 my $pnum = ($port =~ m,^(\d+)$,)[0];
63 unless (@serv = getservbyname($port, $proto[0] || "")) {
64 $@ = "Bad service '$port'";
69 $port = $pnum || $serv[2] || $defport || undef;
71 $proto = (getprotobyname($serv[3]))[2] || undef
75 return ($addr || undef,
86 $@ = join("",ref($sock),": ",@_);
88 if(defined fileno($sock));
95 my($sock,$addr_str, $multi) = @_;
97 if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
98 (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
100 my $h = inet_aton($addr_str);
101 push(@addr, $h) if defined $h;
108 my($lport,$rport,$laddr,$raddr,$proto,$type);
111 $arg->{LocalAddr} = $arg->{LocalHost}
112 if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
114 ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
117 or return _error($sock, $!, $@);
119 $laddr = defined $laddr ? inet_aton($laddr)
122 return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
123 unless(defined $laddr);
125 $arg->{PeerAddr} = $arg->{PeerHost}
126 if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
128 unless(exists $arg->{Listen}) {
129 ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
132 or return _error($sock, $!, $@);
135 $proto ||= (getprotobyname('tcp'))[2];
137 my $pname = (getprotobynumber($proto))[0];
138 $type = $arg->{Type} || $socket_type{$pname};
143 @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
144 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
150 $sock->socket(AF_INET, $type, $proto) or
151 return _error($sock, $!, "$!");
154 $sock->sockopt(SO_REUSEADDR,1) or
155 return _error($sock, $!, "$!");
158 if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
159 $sock->bind($lport || 0, $laddr) or
160 return _error($sock, $!, "$!");
163 if(exists $arg->{Listen}) {
164 $sock->listen($arg->{Listen} || 5) or
165 return _error($sock, $!, "$!");
169 # don't try to connect unless we're given a PeerAddr
170 last unless exists($arg->{PeerAddr});
172 $raddr = shift @raddr;
174 return _error($sock, $EINVAL, 'Cannot determine remote port')
175 unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
178 unless($type == SOCK_STREAM || defined $raddr);
180 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
181 unless defined $raddr;
183 # my $timeout = ${*$sock}{'io_socket_timeout'};
184 # my $before = time() if $timeout;
186 if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
187 # ${*$sock}{'io_socket_timeout'} = $timeout;
191 return _error($sock, $!, "Timeout")
195 # my $new_timeout = $timeout - (time() - $before);
196 # return _error($sock,
197 # (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
198 # "Timeout") if $new_timeout <= 0;
199 # ${*$sock}{'io_socket_timeout'} = $new_timeout;
208 @_ == 2 || @_ == 3 or
209 croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
211 return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
215 @_ == 2 || @_ == 3 or
216 croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
218 return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
222 @_ == 1 or croak 'usage: $sock->sockaddr()';
224 my $name = $sock->sockname;
225 $name ? (sockaddr_in($name))[1] : undef;
229 @_ == 1 or croak 'usage: $sock->sockport()';
231 my $name = $sock->sockname;
232 $name ? (sockaddr_in($name))[0] : undef;
236 @_ == 1 or croak 'usage: $sock->sockhost()';
238 my $addr = $sock->sockaddr;
239 $addr ? inet_ntoa($addr) : undef;
243 @_ == 1 or croak 'usage: $sock->peeraddr()';
245 my $name = $sock->peername;
246 $name ? (sockaddr_in($name))[1] : undef;
250 @_ == 1 or croak 'usage: $sock->peerport()';
252 my $name = $sock->peername;
253 $name ? (sockaddr_in($name))[0] : undef;
257 @_ == 1 or croak 'usage: $sock->peerhost()';
259 my $addr = $sock->peeraddr;
260 $addr ? inet_ntoa($addr) : undef;
269 IO::Socket::INET - Object interface for AF_INET domain sockets
273 use IO::Socket::INET;
277 C<IO::Socket::INET> provides an object interface to creating and using sockets
278 in the AF_INET domain. It is built upon the L<IO::Socket> interface and
279 inherits all the methods defined by L<IO::Socket>.
287 Creates an C<IO::Socket::INET> object, which is a reference to a
288 newly created symbol (see the C<Symbol> package). C<new>
289 optionally takes arguments, these arguments are in key-value pairs.
291 In addition to the key-value pairs accepted by L<IO::Socket>,
292 C<IO::Socket::INET> provides.
295 PeerAddr Remote host address <hostname>[:<port>]
296 PeerHost Synonym for PeerAddr
297 PeerPort Remote port or service <service>[(<no>)] | <no>
298 LocalAddr Local host bind address hostname[:port]
299 LocalHost Synonym for LocalAddr
300 LocalPort Local host bind port <service>[(<no>)] | <no>
301 Proto Protocol name (or number) "tcp" | "udp" | ...
302 Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
303 Listen Queue size for listen
304 Reuse Set SO_REUSEADDR before binding
305 Timeout Timeout value for various operations
306 MultiHomed Try all adresses for multi-homed hosts
309 If C<Listen> is defined then a listen socket is created, else if the
310 socket type, which is derived from the protocol, is SOCK_STREAM then
313 Although it is not illegal, the use of C<MultiHomed> on a socket
314 which is in non-blocking mode is of little use. This is because the
315 first connect will never fail with a timeout as the connaect call
318 The C<PeerAddr> can be a hostname or the IP-address on the
319 "xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
320 service name. The service name might be followed by a number in
321 parenthesis which is used if the service is not known by the system.
322 The C<PeerPort> specification can also be embedded in the C<PeerAddr>
323 by preceding it with a ":".
325 If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
326 then the constructor will try to derive C<Proto> from the service
327 name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
328 parameter will be deduced from C<Proto> if not specified.
330 If the constructor is only passed a single argument, it is assumed to
331 be a C<PeerAddr> specification.
335 $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
336 PeerPort => 'http(80)',
339 $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
341 $sock = IO::Socket::INET->new(Listen => 5,
342 LocalAddr => 'localhost',
346 $sock = IO::Socket::INET->new('127.0.0.1:25');
349 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
351 As of VERSION 1.18 all IO::Socket objects have autoflush turned on
352 by default. This was not the case with earlier releases.
354 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
364 Return the address part of the sockaddr structure for the socket
368 Return the port number that the socket is using on the local host
372 Return the address part of the sockaddr structure for the socket in a
373 text form xx.xx.xx.xx
377 Return the address part of the sockaddr structure for the socket on
382 Return the port number for the socket on the peer host.
386 Return the address part of the sockaddr structure for the socket on the
387 peer host in a text form xx.xx.xx.xx
393 L<Socket>, L<IO::Socket>
397 Graham Barr. Currently maintained by the Perl Porters. Please report all
398 bugs to <perl5-porters@perl.org>.
402 Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
403 This program is free software; you can redistribute it and/or
404 modify it under the same terms as Perl itself.