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\(\)/]+)$,,);
44 if(defined $proto && $proto =~ /\D/) {
45 if(@proto = getprotobyname($proto)) {
46 $proto = $proto[2] || undef;
49 $@ = "Bad protocol '$proto'";
55 my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef;
56 my $pnum = ($port =~ m,^(\d+)$,)[0];
58 @serv = getservbyname($port, $proto[0] || "")
61 $port = $serv[2] || $defport || $pnum;
62 unless (defined $port) {
63 $@ = "Bad service '$origport'";
67 $proto = (getprotobyname($serv[3]))[2] || undef
71 return ($addr || undef,
82 my $title = ref($sock).": ";
83 $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_);
85 if(defined fileno($sock));
92 my($sock,$addr_str, $multi) = @_;
94 if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
95 (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
97 my $h = inet_aton($addr_str);
98 push(@addr, $h) if defined $h;
105 my($lport,$rport,$laddr,$raddr,$proto,$type);
108 $arg->{LocalAddr} = $arg->{LocalHost}
109 if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
111 ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
114 or return _error($sock, $!, $@);
116 $laddr = defined $laddr ? inet_aton($laddr)
119 return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
120 unless(defined $laddr);
122 $arg->{PeerAddr} = $arg->{PeerHost}
123 if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
125 unless(exists $arg->{Listen}) {
126 ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
129 or return _error($sock, $!, $@);
132 $sock->blocking($arg->{Blocking}) if defined $arg->{Blocking};
134 $proto ||= (getprotobyname('tcp'))[2];
136 my $pname = (getprotobynumber($proto))[0];
137 $type = $arg->{Type} || $socket_type{$pname};
142 @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
143 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
149 $sock->socket(AF_INET, $type, $proto) or
150 return _error($sock, $!, "$!");
152 if ($arg->{Reuse} || $arg->{ReuseAddr}) {
153 $sock->sockopt(SO_REUSEADDR,1) or
154 return _error($sock, $!, "$!");
157 if ($arg->{ReusePort}) {
158 $sock->sockopt(SO_REUSEPORT,1) or
159 return _error($sock, $!, "$!");
162 if ($arg->{Broadcast}) {
163 $sock->sockopt(SO_BROADCAST,1) or
164 return _error($sock, $!, "$!");
167 if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
168 $sock->bind($lport || 0, $laddr) or
169 return _error($sock, $!, "$!");
172 if(exists $arg->{Listen}) {
173 $sock->listen($arg->{Listen} || 5) or
174 return _error($sock, $!, "$!");
178 # don't try to connect unless we're given a PeerAddr
179 last unless exists($arg->{PeerAddr});
181 $raddr = shift @raddr;
183 return _error($sock, $EINVAL, 'Cannot determine remote port')
184 unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
187 unless($type == SOCK_STREAM || defined $raddr);
189 return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
190 unless defined $raddr;
192 # my $timeout = ${*$sock}{'io_socket_timeout'};
193 # my $before = time() if $timeout;
196 if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
197 # ${*$sock}{'io_socket_timeout'} = $timeout;
201 return _error($sock, $!, $@ || "Timeout")
205 # my $new_timeout = $timeout - (time() - $before);
206 # return _error($sock,
207 # (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
208 # "Timeout") if $new_timeout <= 0;
209 # ${*$sock}{'io_socket_timeout'} = $new_timeout;
218 @_ == 2 || @_ == 3 or
219 croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
221 return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
225 @_ == 2 || @_ == 3 or
226 croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
228 return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
232 @_ == 1 or croak 'usage: $sock->sockaddr()';
234 my $name = $sock->sockname;
235 $name ? (sockaddr_in($name))[1] : undef;
239 @_ == 1 or croak 'usage: $sock->sockport()';
241 my $name = $sock->sockname;
242 $name ? (sockaddr_in($name))[0] : undef;
246 @_ == 1 or croak 'usage: $sock->sockhost()';
248 my $addr = $sock->sockaddr;
249 $addr ? inet_ntoa($addr) : undef;
253 @_ == 1 or croak 'usage: $sock->peeraddr()';
255 my $name = $sock->peername;
256 $name ? (sockaddr_in($name))[1] : undef;
260 @_ == 1 or croak 'usage: $sock->peerport()';
262 my $name = $sock->peername;
263 $name ? (sockaddr_in($name))[0] : undef;
267 @_ == 1 or croak 'usage: $sock->peerhost()';
269 my $addr = $sock->peeraddr;
270 $addr ? inet_ntoa($addr) : undef;
279 IO::Socket::INET - Object interface for AF_INET domain sockets
283 use IO::Socket::INET;
287 C<IO::Socket::INET> provides an object interface to creating and using sockets
288 in the AF_INET domain. It is built upon the L<IO::Socket> interface and
289 inherits all the methods defined by L<IO::Socket>.
297 Creates an C<IO::Socket::INET> object, which is a reference to a
298 newly created symbol (see the C<Symbol> package). C<new>
299 optionally takes arguments, these arguments are in key-value pairs.
301 In addition to the key-value pairs accepted by L<IO::Socket>,
302 C<IO::Socket::INET> provides.
305 PeerAddr Remote host address <hostname>[:<port>]
306 PeerHost Synonym for PeerAddr
307 PeerPort Remote port or service <service>[(<no>)] | <no>
308 LocalAddr Local host bind address hostname[:port]
309 LocalHost Synonym for LocalAddr
310 LocalPort Local host bind port <service>[(<no>)] | <no>
311 Proto Protocol name (or number) "tcp" | "udp" | ...
312 Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
313 Listen Queue size for listen
314 ReuseAddr Set SO_REUSEADDR before binding
315 Reuse Set SO_REUSEADDR before binding (deprecated, prefer ReuseAddr)
316 ReusePort Set SO_REUSEPORT before binding
317 Broadcast Set SO_BROADCAST before binding
318 Timeout Timeout value for various operations
319 MultiHomed Try all adresses for multi-homed hosts
320 Blocking Determine if connection will be blocking mode
322 If C<Listen> is defined then a listen socket is created, else if the
323 socket type, which is derived from the protocol, is SOCK_STREAM then
326 Although it is not illegal, the use of C<MultiHomed> on a socket
327 which is in non-blocking mode is of little use. This is because the
328 first connect will never fail with a timeout as the connect call
331 The C<PeerAddr> can be a hostname or the IP-address on the
332 "xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
333 service name. The service name might be followed by a number in
334 parenthesis which is used if the service is not known by the system.
335 The C<PeerPort> specification can also be embedded in the C<PeerAddr>
336 by preceding it with a ":".
338 If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
339 then the constructor will try to derive C<Proto> from the service
340 name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
341 parameter will be deduced from C<Proto> if not specified.
343 If the constructor is only passed a single argument, it is assumed to
344 be a C<PeerAddr> specification.
346 If C<Blocking> is set to 0, the connection will be in nonblocking mode.
347 If not specified it defaults to 1 (blocking mode).
351 $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
352 PeerPort => 'http(80)',
355 $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
357 $sock = IO::Socket::INET->new(Listen => 5,
358 LocalAddr => 'localhost',
362 $sock = IO::Socket::INET->new('127.0.0.1:25');
364 $sock = IO::Socket::INET->new(PeerPort => 9999,
365 PeerAddr => inet_ntoa(INADDR_BROADCAST),
367 LocalAddr => 'localhost',
369 or die "Can't bind : $@\n";
371 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
373 As of VERSION 1.18 all IO::Socket objects have autoflush turned on
374 by default. This was not the case with earlier releases.
376 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
386 Return the address part of the sockaddr structure for the socket
390 Return the port number that the socket is using on the local host
394 Return the address part of the sockaddr structure for the socket in a
395 text form xx.xx.xx.xx
399 Return the address part of the sockaddr structure for the socket on
404 Return the port number for the socket on the peer host.
408 Return the address part of the sockaddr structure for the socket on the
409 peer host in a text form xx.xx.xx.xx
415 L<Socket>, L<IO::Socket>
419 Graham Barr. Currently maintained by the Perl Porters. Please report all
420 bugs to <perl5-porters@perl.org>.
424 Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
425 This program is free software; you can redistribute it and/or
426 modify it under the same terms as Perl itself.