ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.121
Committed: Sat Jan 30 21:28:00 2010 UTC (14 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-5_251, rel-5_261, rel-5_26
Changes since 1.120: +0 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.7 =head1 NAME
2 elmex 1.1
3 root 1.7 AnyEvent::Socket - useful IPv4 and IPv6 stuff.
4 elmex 1.1
5 root 1.7 =head1 SYNOPSIS
6 elmex 1.1
7 root 1.45 use AnyEvent::Socket;
8    
9     tcp_connect "gameserver.deliantra.net", 13327, sub {
10     my ($fh) = @_
11     or die "gameserver.deliantra.net connect failed: $!";
12    
13     # enjoy your filehandle
14     };
15    
16     # a simple tcp server
17     tcp_server undef, 8888, sub {
18     my ($fh, $host, $port) = @_;
19    
20     syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
21     };
22 root 1.19
23 root 1.7 =head1 DESCRIPTION
24 elmex 1.1
25 root 1.7 This module implements various utility functions for handling internet
26     protocol addresses and sockets, in an as transparent and simple way as
27     possible.
28 elmex 1.1
29 root 1.7 All functions documented without C<AnyEvent::Socket::> prefix are exported
30     by default.
31 elmex 1.1
32 root 1.7 =over 4
33 elmex 1.1
34 root 1.7 =cut
35 elmex 1.1
36 root 1.7 package AnyEvent::Socket;
37 elmex 1.1
38 root 1.7 use Carp ();
39     use Errno ();
40 root 1.34 use Socket qw(AF_INET AF_UNIX SOCK_STREAM SOCK_DGRAM SOL_SOCKET SO_REUSEADDR);
41 elmex 1.1
42 root 1.96 use AnyEvent (); BEGIN { AnyEvent::common_sense }
43 root 1.21 use AnyEvent::Util qw(guard fh_nonblocking AF_INET6);
44 root 1.17 use AnyEvent::DNS ();
45 elmex 1.1
46 root 1.7 use base 'Exporter';
47 elmex 1.2
48 root 1.34 our @EXPORT = qw(
49 root 1.93 getprotobyname
50 root 1.103 parse_hostport format_hostport
51 root 1.34 parse_ipv4 parse_ipv6
52     parse_ip parse_address
53 root 1.85 format_ipv4 format_ipv6
54 root 1.34 format_ip format_address
55     address_family
56     inet_aton
57     tcp_server
58     tcp_connect
59     );
60 elmex 1.2
61 root 1.110 our $VERSION = $AnyEvent::VERSION;
62 root 1.108
63     # used in cases where we may return immediately but want the
64     # caller to do stuff first
65     sub _postpone {
66 root 1.112 my ($cb, @args) = (@_, $!);
67 root 1.108
68     my $w; $w = AE::timer 0, 0, sub {
69     undef $w;
70 root 1.112 $! = pop @args;
71 root 1.108 $cb->(@args);
72     };
73     }
74 elmex 1.1
75 root 1.9 =item $ipn = parse_ipv4 $dotted_quad
76    
77     Tries to parse the given dotted quad IPv4 address and return it in
78     octet form (or undef when it isn't in a parsable format). Supports all
79     forms specified by POSIX (e.g. C<10.0.0.1>, C<10.1>, C<10.0x020304>,
80     C<0x12345678> or C<0377.0377.0377.0377>).
81    
82     =cut
83    
84     sub parse_ipv4($) {
85     $_[0] =~ /^ (?: 0x[0-9a-fA-F]+ | 0[0-7]* | [1-9][0-9]* )
86     (?:\. (?: 0x[0-9a-fA-F]+ | 0[0-7]* | [1-9][0-9]* ) ){0,3}$/x
87     or return undef;
88    
89     @_ = map /^0/ ? oct : $_, split /\./, $_[0];
90    
91     # check leading parts against range
92     return undef if grep $_ >= 256, @_[0 .. @_ - 2];
93    
94     # check trailing part against range
95 root 1.51 return undef if $_[-1] >= 2 ** (8 * (4 - $#_));
96 root 1.9
97     pack "N", (pop)
98     + ($_[0] << 24)
99     + ($_[1] << 16)
100     + ($_[2] << 8);
101     }
102    
103 root 1.14 =item $ipn = parse_ipv6 $textual_ipv6_address
104 root 1.9
105     Tries to parse the given IPv6 address and return it in
106     octet form (or undef when it isn't in a parsable format).
107    
108     Should support all forms specified by RFC 2373 (and additionally all IPv4
109 root 1.26 forms supported by parse_ipv4). Note that scope-id's are not supported
110     (and will not parse).
111 root 1.12
112     This function works similarly to C<inet_pton AF_INET6, ...>.
113 root 1.9
114 root 1.116 Example:
115    
116     print unpack "H*", parse_ipv6 "2002:5345::10.0.0.1";
117     # => 2002534500000000000000000a000001
118    
119 root 1.9 =cut
120    
121     sub parse_ipv6($) {
122     # quick test to avoid longer processing
123     my $n = $_[0] =~ y/://;
124     return undef if $n < 2 || $n > 8;
125    
126     my ($h, $t) = split /::/, $_[0], 2;
127    
128 root 1.11 unless (defined $t) {
129 root 1.9 ($h, $t) = (undef, $h);
130     }
131    
132     my @h = split /:/, $h;
133     my @t = split /:/, $t;
134    
135 root 1.14 # check for ipv4 tail
136 root 1.9 if (@t && $t[-1]=~ /\./) {
137     return undef if $n > 6;
138    
139     my $ipn = parse_ipv4 pop @t
140     or return undef;
141    
142     push @t, map +(sprintf "%x", $_), unpack "nn", $ipn;
143     }
144    
145     # no :: then we need to have exactly 8 components
146 root 1.11 return undef unless @h + @t == 8 || $_[0] =~ /::/;
147 root 1.9
148     # now check all parts for validity
149     return undef if grep !/^[0-9a-fA-F]{1,4}$/, @h, @t;
150    
151     # now pad...
152     push @h, 0 while @h + @t < 8;
153    
154     # and done
155     pack "n*", map hex, @h, @t
156 root 1.7 }
157 elmex 1.1
158 root 1.34 sub parse_unix($) {
159     $_[0] eq "unix/"
160     ? pack "S", AF_UNIX
161     : undef
162 root 1.11
163 root 1.34 }
164    
165 root 1.81 =item $ipn = parse_address $ip
166 root 1.34
167     Combines C<parse_ipv4> and C<parse_ipv6> in one function. The address
168     here refers to the host address (not socket address) in network form
169     (binary).
170    
171     If the C<$text> is C<unix/>, then this function returns a special token
172     recognised by the other functions in this module to mean "UNIX domain
173     socket".
174 root 1.11
175 root 1.81 If the C<$text> to parse is a mapped IPv4 in IPv6 address (:ffff::<ipv4>),
176     then it will be treated as an IPv4 address. If you don't want that, you
177     have to call C<parse_ipv4> and/or C<parse_ipv6> manually.
178    
179 root 1.116 Example:
180    
181     print unpack "H*", parse_address "10.1.2.3";
182     # => 0a010203
183    
184 root 1.81 =item $ipn = AnyEvent::Socket::aton $ip
185 root 1.58
186     Same as C<parse_address>, but not exported (think C<Socket::inet_aton> but
187     I<without> name resolution).
188    
189 root 1.11 =cut
190    
191 root 1.34 sub parse_address($) {
192 root 1.81 for (&parse_ipv6) {
193     if ($_) {
194     s/^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff//;
195     return $_;
196     } else {
197     return &parse_ipv4 || &parse_unix
198     }
199     }
200 root 1.11 }
201    
202 root 1.58 *aton = \&parse_address;
203 root 1.34
204 root 1.93 =item ($name, $aliases, $proto) = getprotobyname $name
205    
206     Works like the builtin function of the same name, except it tries hard to
207     work even on broken platforms (well, that's windows), where getprotobyname
208     is traditionally very unreliable.
209    
210 root 1.116 Example: get the protocol number for TCP (usually 6)
211    
212     my $proto = getprotobyname "tcp";
213    
214 root 1.93 =cut
215    
216     # microsoft can't even get getprotobyname working (the etc/protocols file
217     # gets lost fairly often on windows), so we have to hardcode some common
218     # protocol numbers ourselves.
219     our %PROTO_BYNAME;
220    
221     $PROTO_BYNAME{tcp} = Socket::IPPROTO_TCP () if defined &Socket::IPPROTO_TCP;
222     $PROTO_BYNAME{udp} = Socket::IPPROTO_UDP () if defined &Socket::IPPROTO_UDP;
223     $PROTO_BYNAME{icmp} = Socket::IPPROTO_ICMP() if defined &Socket::IPPROTO_ICMP;
224    
225     sub getprotobyname($) {
226     my $name = lc shift;
227    
228     defined (my $proton = $PROTO_BYNAME{$name} || (getprotobyname $name)[2])
229     or return;
230    
231     ($name, uc $name, $proton)
232     }
233    
234 root 1.54 =item ($host, $service) = parse_hostport $string[, $default_service]
235    
236     Splitting a string of the form C<hostname:port> is a common
237     problem. Unfortunately, just splitting on the colon makes it hard to
238     specify IPv6 addresses and doesn't support the less common but well
239     standardised C<[ip literal]> syntax.
240    
241     This function tries to do this job in a better way, it supports the
242     following formats, where C<port> can be a numerical port number of a
243     service name, or a C<name=port> string, and the C< port> and C<:port>
244     parts are optional. Also, everywhere where an IP address is supported
245     a hostname or unix domain socket address is also supported (see
246     C<parse_unix>).
247    
248     hostname:port e.g. "www.linux.org", "www.x.de:443", "www.x.de:https=443"
249     ipv4:port e.g. "198.182.196.56", "127.1:22"
250     ipv6 e.g. "::1", "affe::1"
251     [ipv4or6]:port e.g. "[::1]", "[10.0.1]:80"
252     [ipv4or6] port e.g. "[127.0.0.1]", "[www.x.org] 17"
253     ipv4or6 port e.g. "::1 443", "10.0.0.1 smtp"
254    
255     It also supports defaulting the service name in a simple way by using
256     C<$default_service> if no service was detected. If neither a service was
257     detected nor a default was specified, then this function returns the
258 root 1.102 empty list. The same happens when a parse error was detected, such as a
259 root 1.54 hostname with a colon in it (the function is rather conservative, though).
260    
261     Example:
262    
263     print join ",", parse_hostport "localhost:443";
264     # => "localhost,443"
265    
266     print join ",", parse_hostport "localhost", "https";
267     # => "localhost,https"
268    
269     print join ",", parse_hostport "[::1]";
270     # => "," (empty list)
271    
272     =cut
273    
274     sub parse_hostport($;$) {
275     my ($host, $port);
276    
277 root 1.56 for ("$_[0]") { # work on a copy, just in case, and also reset pos
278 root 1.55
279 root 1.54 # parse host, special cases: "ipv6" or "ipv6 port"
280     unless (
281 root 1.55 ($host) = /^\s* ([0-9a-fA-F:]*:[0-9a-fA-F:]*:[0-9a-fA-F\.:]*)/xgc
282 root 1.54 and parse_ipv6 $host
283     ) {
284     /^\s*/xgc;
285    
286     if (/^ \[ ([^\[\]]+) \]/xgc) {
287     $host = $1;
288     } elsif (/^ ([^\[\]:\ ]+) /xgc) {
289     $host = $1;
290     } else {
291     return;
292     }
293     }
294    
295     # parse port
296     if (/\G (?:\s+|:) ([^:[:space:]]+) \s*$/xgc) {
297     $port = $1;
298     } elsif (/\G\s*$/gc && length $_[1]) {
299     $port = $_[1];
300     } else {
301     return;
302     }
303     }
304    
305     # hostnames must not contain :'s
306     return if $host =~ /:/ && !parse_ipv6 $host;
307    
308     ($host, $port)
309     }
310    
311 root 1.103 =item $string = format_hostport $host, $port
312    
313     Takes a host (in textual form) and a port and formats in unambigiously in
314     a way that C<parse_hostport> can parse it again. C<$port> can be C<undef>.
315    
316     =cut
317    
318     sub format_hostport($;$) {
319     my ($host, $port) = @_;
320    
321     $port = ":$port" if length $port;
322     $host = "[$host]" if $host =~ /:/;
323    
324     "$host$port"
325     }
326    
327 root 1.34 =item $sa_family = address_family $ipn
328    
329     Returns the address family/protocol-family (AF_xxx/PF_xxx, in one value :)
330     of the given host address in network format.
331    
332     =cut
333    
334     sub address_family($) {
335     4 == length $_[0]
336     ? AF_INET
337     : 16 == length $_[0]
338     ? AF_INET6
339     : unpack "S", $_[0]
340     }
341 root 1.11
342 root 1.81 =item $text = format_ipv4 $ipn
343    
344     Expects a four octet string representing a binary IPv4 address and returns
345     its textual format. Rarely used, see C<format_address> for a nicer
346     interface.
347    
348     =item $text = format_ipv6 $ipn
349    
350     Expects a sixteen octet string representing a binary IPv6 address and
351     returns its textual format. Rarely used, see C<format_address> for a
352     nicer interface.
353    
354 root 1.34 =item $text = format_address $ipn
355    
356     Covnvert a host address in network format (e.g. 4 octets for IPv4 or 16
357     octets for IPv6) and convert it into textual form.
358    
359     Returns C<unix/> for UNIX domain sockets.
360 root 1.11
361 root 1.12 This function works similarly to C<inet_ntop AF_INET || AF_INET6, ...>,
362     except it automatically detects the address type.
363    
364 root 1.34 Returns C<undef> if it cannot detect the type.
365    
366 root 1.81 If the C<$ipn> is a mapped IPv4 in IPv6 address (:ffff::<ipv4>), then just
367     the contained IPv4 address will be returned. If you do not want that, you
368     have to call C<format_ipv6> manually.
369    
370 root 1.116 Example:
371    
372     print format_address "\x01\x02\x03\x05";
373     => 1.2.3.5
374    
375 root 1.58 =item $text = AnyEvent::Socket::ntoa $ipn
376    
377     Same as format_address, but not exported (think C<inet_ntoa>).
378    
379 root 1.11 =cut
380    
381 root 1.81 sub format_ipv4($) {
382     join ".", unpack "C4", $_[0]
383     }
384    
385     sub format_ipv6($) {
386 root 1.120 if ($_[0] =~ /^\x00\x00\x00\x00\x00\x00\x00\x00/) {
387     if (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 eq $_[0]) {
388     return "::";
389     } elsif (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1 eq $_[0]) {
390     return "::1";
391     } elsif (v0.0.0.0.0.0.0.0.0.0.0.0 eq substr $_[0], 0, 12) {
392     # v4compatible
393     return "::" . format_ipv4 substr $_[0], 12;
394     } elsif (v0.0.0.0.0.0.0.0.0.0.255.255 eq substr $_[0], 0, 12) {
395     # v4mapped
396     return "::ffff:" . format_ipv4 substr $_[0], 12;
397     } elsif (v0.0.0.0.0.0.0.0.255.255.0.0 eq substr $_[0], 0, 12) {
398     # v4translated
399     return "::ffff:0:" . format_ipv4 substr $_[0], 12;
400     }
401     }
402    
403     my $ip = sprintf "%x:%x:%x:%x:%x:%x:%x:%x", unpack "n8", $_[0];
404    
405     # this is admittedly rather sucky
406     $ip =~ s/(?:^|:) 0:0:0:0:0:0:0 (?:$|:)/::/x
407     or $ip =~ s/(?:^|:) 0:0:0:0:0:0 (?:$|:)/::/x
408     or $ip =~ s/(?:^|:) 0:0:0:0:0 (?:$|:)/::/x
409     or $ip =~ s/(?:^|:) 0:0:0:0 (?:$|:)/::/x
410     or $ip =~ s/(?:^|:) 0:0:0 (?:$|:)/::/x
411     or $ip =~ s/(?:^|:) 0:0 (?:$|:)/::/x
412     or $ip =~ s/(?:^|:) 0 (?:$|:)/::/x;
413 root 1.81
414 root 1.120 $ip
415 root 1.81 }
416    
417 root 1.34 sub format_address($) {
418 root 1.120 if (4 == length $_[0]) {
419 root 1.81 return &format_ipv4;
420 root 1.120 } elsif (16 == length $_[0]) {
421     return $_[0] =~ /^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff(....)$/s
422     ? format_ipv4 $1
423 root 1.81 : &format_ipv6;
424 root 1.120 } elsif (AF_UNIX == address_family $_[0]) {
425 root 1.34 return "unix/"
426 root 1.11 } else {
427     return undef
428     }
429     }
430    
431 root 1.58 *ntoa = \&format_address;
432 root 1.34
433 root 1.7 =item inet_aton $name_or_address, $cb->(@addresses)
434 elmex 1.1
435 root 1.7 Works similarly to its Socket counterpart, except that it uses a
436 root 1.117 callback. Use the length to distinguish between ipv4 and ipv6 (4 octets
437     for IPv4, 16 for IPv6), or use C<format_address> to convert it to a more
438     readable format.
439    
440     Note that C<resolve_sockaddr>, while initially a more complex interface,
441 root 1.118 resolves host addresses, IDNs, service names and SRV records and gives you
442     an ordered list of socket addresses to try and should be preferred over
443 root 1.117 C<inet_aton>.
444 elmex 1.2
445 root 1.116 Example.
446    
447     inet_aton "www.google.com", my $cv = AE::cv;
448     say unpack "H*", $_
449     for $cv->recv;
450     # => d155e363
451     # => d155e367 etc.
452    
453 root 1.117 inet_aton "ipv6.google.com", my $cv = AE::cv;
454     say unpack "H*", $_
455     for $cv->recv;
456     # => 20014860a00300000000000000000068
457    
458 root 1.7 =cut
459 elmex 1.2
460 root 1.7 sub inet_aton {
461     my ($name, $cb) = @_;
462 elmex 1.2
463 root 1.9 if (my $ipn = &parse_ipv4) {
464     $cb->($ipn);
465     } elsif (my $ipn = &parse_ipv6) {
466     $cb->($ipn);
467 root 1.7 } elsif ($name eq "localhost") { # rfc2606 et al.
468 root 1.9 $cb->(v127.0.0.1, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1);
469 root 1.7 } else {
470     require AnyEvent::DNS;
471 elmex 1.2
472 root 1.117 my $ipv4 = $AnyEvent::PROTOCOL{ipv4};
473     my $ipv6 = $AnyEvent::PROTOCOL{ipv6};
474    
475     my @res;
476    
477     my $cv = AE::cv {
478     $cb->(map @$_, reverse @res);
479     };
480    
481     $cv->begin;
482    
483     if ($ipv4) {
484     $cv->begin;
485     AnyEvent::DNS::a ($name, sub {
486     $res[$ipv4] = [map &parse_ipv4, @_];
487     $cv->end;
488     });
489     };
490    
491     if ($ipv6) {
492     $cv->begin;
493     AnyEvent::DNS::aaaa ($name, sub {
494     $res[$ipv6] = [map &parse_ipv6, @_];
495     $cv->end;
496     });
497     };
498    
499     $cv->end;
500 root 1.7 }
501     }
502 elmex 1.2
503 root 1.95 BEGIN {
504     *sockaddr_family = $Socket::VERSION >= 1.75
505     ? \&Socket::sockaddr_family
506     : # for 5.6.x, we need to do something much more horrible
507     (Socket::pack_sockaddr_in 0x5555, "\x55\x55\x55\x55"
508     | eval { Socket::pack_sockaddr_un "U" }) =~ /^\x00/
509     ? sub { unpack "xC", $_[0] }
510     : sub { unpack "S" , $_[0] };
511     }
512    
513 root 1.117 # check for broken platforms with an extra field in sockaddr structure
514 root 1.32 # kind of a rfc vs. bsd issue, as usual (ok, normally it's a
515     # unix vs. bsd issue, a iso C vs. bsd issue or simply a
516 root 1.95 # correctness vs. bsd issue.)
517     my $pack_family = 0x55 == sockaddr_family ("\x55\x55")
518 root 1.32 ? "xC" : "S";
519    
520 root 1.34 =item $sa = AnyEvent::Socket::pack_sockaddr $service, $host
521 root 1.15
522 root 1.34 Pack the given port/host combination into a binary sockaddr
523     structure. Handles both IPv4 and IPv6 host addresses, as well as UNIX
524     domain sockets (C<$host> == C<unix/> and C<$service> == absolute
525     pathname).
526 root 1.15
527 root 1.116 Example:
528    
529     my $bind = AnyEvent::Socket::pack_sockaddr 43, v195.234.53.120;
530     bind $socket, $bind
531     or die "bind: $!";
532    
533 root 1.15 =cut
534    
535     sub pack_sockaddr($$) {
536 root 1.34 my $af = address_family $_[1];
537    
538     if ($af == AF_INET) {
539 root 1.15 Socket::pack_sockaddr_in $_[0], $_[1]
540 root 1.34 } elsif ($af == AF_INET6) {
541 root 1.32 pack "$pack_family nL a16 L",
542 root 1.21 AF_INET6,
543 root 1.15 $_[0], # port
544     0, # flowinfo
545     $_[1], # addr
546     0 # scope id
547 root 1.34 } elsif ($af == AF_UNIX) {
548     Socket::pack_sockaddr_un $_[0]
549 root 1.15 } else {
550     Carp::croak "pack_sockaddr: invalid host";
551     }
552     }
553    
554 root 1.34 =item ($service, $host) = AnyEvent::Socket::unpack_sockaddr $sa
555 root 1.15
556     Unpack the given binary sockaddr structure (as used by bind, getpeername
557 root 1.34 etc.) into a C<$service, $host> combination.
558    
559     For IPv4 and IPv6, C<$service> is the port number and C<$host> the host
560     address in network format (binary).
561 root 1.15
562 root 1.34 For UNIX domain sockets, C<$service> is the absolute pathname and C<$host>
563     is a special token that is understood by the other functions in this
564     module (C<format_address> converts it to C<unix/>).
565 root 1.15
566     =cut
567    
568 root 1.113 # perl contains a bug (imho) where it requires that the kernel always returns
569     # sockaddr_un structures of maximum length (which is not, AFAICS, required
570     # by any standard). try to 0-pad structures for the benefit of those platforms.
571    
572 root 1.114 my $sa_un_zero = eval { Socket::pack_sockaddr_un "" }; $sa_un_zero ^= $sa_un_zero;
573 root 1.113
574 root 1.15 sub unpack_sockaddr($) {
575 root 1.95 my $af = sockaddr_family $_[0];
576 root 1.15
577 root 1.23 if ($af == AF_INET) {
578 root 1.15 Socket::unpack_sockaddr_in $_[0]
579 root 1.21 } elsif ($af == AF_INET6) {
580     unpack "x2 n x4 a16", $_[0]
581 root 1.34 } elsif ($af == AF_UNIX) {
582 root 1.113 ((Socket::unpack_sockaddr_un $_[0] ^ $sa_un_zero), pack "S", AF_UNIX)
583 root 1.15 } else {
584     Carp::croak "unpack_sockaddr: unsupported protocol family $af";
585     }
586     }
587    
588 root 1.34 =item resolve_sockaddr $node, $service, $proto, $family, $type, $cb->([$family, $type, $proto, $sockaddr], ...)
589    
590     Tries to resolve the given nodename and service name into protocol families
591     and sockaddr structures usable to connect to this node and service in a
592     protocol-independent way. It works remotely similar to the getaddrinfo
593     posix function.
594    
595 root 1.118 For internet addresses, C<$node> is either an IPv4 or IPv6 address, an
596     internet hostname (DNS domain name or IDN), and C<$service> is either
597     a service name (port name from F</etc/services>) or a numerical port
598     number. If both C<$node> and C<$service> are names, then SRV records
599     will be consulted to find the real service, otherwise they will be
600     used as-is. If you know that the service name is not in your services
601     database, then you can specify the service in the format C<name=port>
602     (e.g. C<http=80>).
603 root 1.34
604     For UNIX domain sockets, C<$node> must be the string C<unix/> and
605     C<$service> must be the absolute pathname of the socket. In this case,
606     C<$proto> will be ignored.
607    
608     C<$proto> must be a protocol name, currently C<tcp>, C<udp> or
609     C<sctp>. The default is currently C<tcp>, but in the future, this function
610     might try to use other protocols such as C<sctp>, depending on the socket
611     type and any SRV records it might find.
612    
613     C<$family> must be either C<0> (meaning any protocol is OK), C<4> (use
614 root 1.67 only IPv4) or C<6> (use only IPv6). The default is influenced by
615 root 1.34 C<$ENV{PERL_ANYEVENT_PROTOCOLS}>.
616    
617     C<$type> must be C<SOCK_STREAM>, C<SOCK_DGRAM> or C<SOCK_SEQPACKET> (or
618 root 1.67 C<undef> in which case it gets automatically chosen to be C<SOCK_STREAM>
619     unless C<$proto> is C<udp>).
620 root 1.34
621     The callback will receive zero or more array references that contain
622     C<$family, $type, $proto> for use in C<socket> and a binary
623     C<$sockaddr> for use in C<connect> (or C<bind>).
624    
625     The application should try these in the order given.
626    
627     Example:
628    
629     resolve_sockaddr "google.com", "http", 0, undef, undef, sub { ... };
630    
631     =cut
632    
633     sub resolve_sockaddr($$$$$$) {
634     my ($node, $service, $proto, $family, $type, $cb) = @_;
635    
636     if ($node eq "unix/") {
637 root 1.67 return $cb->() if $family || $service !~ /^\//; # no can do
638 root 1.34
639 root 1.67 return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
640 root 1.34 }
641    
642     unless (AF_INET6) {
643     $family != 6
644     or return $cb->();
645    
646     $family = 4;
647     }
648    
649     $cb->() if $family == 4 && !$AnyEvent::PROTOCOL{ipv4};
650     $cb->() if $family == 6 && !$AnyEvent::PROTOCOL{ipv6};
651    
652     $family ||= 4 unless $AnyEvent::PROTOCOL{ipv6};
653     $family ||= 6 unless $AnyEvent::PROTOCOL{ipv4};
654    
655     $proto ||= "tcp";
656     $type ||= $proto eq "udp" ? SOCK_DGRAM : SOCK_STREAM;
657    
658 root 1.93 my $proton = getprotobyname $proto
659 root 1.34 or Carp::croak "$proto: protocol unknown";
660    
661     my $port;
662    
663     if ($service =~ /^(\S+)=(\d+)$/) {
664     ($service, $port) = ($1, $2);
665     } elsif ($service =~ /^\d+$/) {
666     ($service, $port) = (undef, $service);
667     } else {
668     $port = (getservbyname $service, $proto)[2]
669 root 1.35 or Carp::croak "$service/$proto: service unknown";
670 root 1.34 }
671    
672     # resolve a records / provide sockaddr structures
673     my $resolve = sub {
674 root 1.118 my @target = @_;
675    
676 root 1.34 my @res;
677 root 1.107 my $cv = AE::cv {
678 root 1.34 $cb->(
679     map $_->[2],
680     sort {
681     $AnyEvent::PROTOCOL{$b->[1]} <=> $AnyEvent::PROTOCOL{$a->[1]}
682     or $a->[0] <=> $b->[0]
683     }
684     @res
685     )
686 root 1.107 };
687 root 1.34
688     $cv->begin;
689     for my $idx (0 .. $#target) {
690     my ($node, $port) = @{ $target[$idx] };
691    
692     if (my $noden = parse_address $node) {
693 root 1.40 my $af = address_family $noden;
694    
695     if ($af == AF_INET && $family != 6) {
696 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
697     pack_sockaddr $port, $noden]]
698     }
699    
700 root 1.40 if ($af == AF_INET6 && $family != 4) {
701 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
702     pack_sockaddr $port, $noden]]
703     }
704     } else {
705     # ipv4
706     if ($family != 6) {
707     $cv->begin;
708 root 1.39 AnyEvent::DNS::a $node, sub {
709 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
710     pack_sockaddr $port, parse_ipv4 $_]]
711     for @_;
712     $cv->end;
713     };
714     }
715    
716     # ipv6
717     if ($family != 4) {
718     $cv->begin;
719 root 1.39 AnyEvent::DNS::aaaa $node, sub {
720 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
721     pack_sockaddr $port, parse_ipv6 $_]]
722     for @_;
723     $cv->end;
724     };
725     }
726     }
727     }
728     $cv->end;
729     };
730    
731 root 1.118 $node = AnyEvent::Util::idn_to_ascii $node
732     if $node =~ /[^\x00-\x7f]/;
733    
734 root 1.34 # try srv records, if applicable
735     if ($node eq "localhost") {
736 root 1.118 $resolve->(["127.0.0.1", $port], ["::1", $port]);
737 root 1.34 } elsif (defined $service && !parse_address $node) {
738 root 1.39 AnyEvent::DNS::srv $service, $proto, $node, sub {
739 root 1.34 my (@srv) = @_;
740    
741 root 1.118 if (@srv) {
742     # the only srv record has "." ("" here) => abort
743     $srv[0][2] ne "" || $#srv
744     or return $cb->();
745    
746     # use srv records then
747     $resolve->(
748     map ["$_->[3].", $_->[2]],
749     grep $_->[3] ne ".",
750     @srv
751     );
752     } else {
753     # no srv records, continue traditionally
754     $resolve->([$node, $port]);
755     }
756 root 1.34 };
757     } else {
758 root 1.118 # most common case
759     $resolve->([$node, $port]);
760 root 1.34 }
761     }
762    
763 root 1.15 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
764 elmex 1.1
765 root 1.118 This is a convenience function that creates a TCP socket and makes a
766     100% non-blocking connect to the given C<$host> (which can be a DNS/IDN
767     hostname or a textual IP address, or the string C<unix/> for UNIX domain
768     sockets) and C<$service> (which can be a numeric port number or a service
769     name, or a C<servicename=portnumber> string, or the pathname to a UNIX
770     domain socket).
771 root 1.7
772 root 1.8 If both C<$host> and C<$port> are names, then this function will use SRV
773 root 1.15 records to locate the real target(s).
774 root 1.8
775 root 1.15 In either case, it will create a list of target hosts (e.g. for multihomed
776 root 1.17 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
777 root 1.15 each in turn.
778 root 1.7
779 root 1.108 After the connection is established, then the C<$connect_cb> will be
780     invoked with the socket file handle (in non-blocking mode) as first and
781     the peer host (as a textual IP address) and peer port as second and third
782     arguments, respectively. The fourth argument is a code reference that you
783     can call if, for some reason, you don't like this connection, which will
784     cause C<tcp_connect> to try the next one (or call your callback without
785     any arguments if there are no more connections). In most cases, you can
786     simply ignore this argument.
787 root 1.15
788     $cb->($filehandle, $host, $port, $retry)
789 root 1.7
790     If the connect is unsuccessful, then the C<$connect_cb> will be invoked
791     without any arguments and C<$!> will be set appropriately (with C<ENXIO>
792 root 1.17 indicating a DNS resolution failure).
793 root 1.7
794 root 1.108 The callback will I<never> be invoked before C<tcp_connect> returns, even
795     if C<tcp_connect> was able to connect immediately (e.g. on unix domain
796     sockets).
797    
798 root 1.17 The file handle is perfect for being plugged into L<AnyEvent::Handle>, but
799     can be used as a normal perl file handle as well.
800 root 1.7
801 root 1.15 Unless called in void context, C<tcp_connect> returns a guard object that
802     will automatically abort connecting when it gets destroyed (it does not do
803     anything to the socket after the connect was successful).
804    
805 root 1.7 Sometimes you need to "prepare" the socket before connecting, for example,
806     to C<bind> it to some port, or you want a specific connect timeout that
807     is lower than your kernel's default timeout. In this case you can specify
808     a second callback, C<$prepare_cb>. It will be called with the file handle
809     in not-yet-connected state as only argument and must return the connection
810     timeout value (or C<0>, C<undef> or the empty list to indicate the default
811     timeout is to be used).
812    
813 root 1.17 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
814 root 1.7 socket (although only IPv4 is currently supported by this module).
815    
816 root 1.28 Note to the poor Microsoft Windows users: Windows (of course) doesn't
817     correctly signal connection errors, so unless your event library works
818     around this, failed connections will simply hang. The only event libraries
819     that handle this condition correctly are L<EV> and L<Glib>. Additionally,
820     AnyEvent works around this bug with L<Event> and in its pure-perl
821     backend. All other libraries cannot correctly handle this condition. To
822     lessen the impact of this windows bug, a default timeout of 30 seconds
823     will be imposed on windows. Cygwin is not affected.
824 root 1.27
825 root 1.7 Simple Example: connect to localhost on port 22.
826    
827 root 1.45 tcp_connect localhost => 22, sub {
828     my $fh = shift
829     or die "unable to connect: $!";
830     # do something
831     };
832 root 1.7
833     Complex Example: connect to www.google.com on port 80 and make a simple
834     GET request without much error handling. Also limit the connection timeout
835     to 15 seconds.
836    
837     tcp_connect "www.google.com", "http",
838     sub {
839     my ($fh) = @_
840     or die "unable to connect: $!";
841    
842     my $handle; # avoid direct assignment so on_eof has it in scope.
843     $handle = new AnyEvent::Handle
844     fh => $fh,
845 root 1.90 on_error => sub {
846     warn "error $_[2]\n";
847 root 1.91 $_[0]->destroy;
848 root 1.90 },
849 root 1.7 on_eof => sub {
850 root 1.90 $handle->destroy; # destroy handle
851 root 1.7 warn "done.\n";
852     };
853    
854     $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
855    
856 elmex 1.111 $handle->push_read (line => "\015\012\015\012", sub {
857 root 1.7 my ($handle, $line) = @_;
858    
859     # print response header
860     print "HEADER\n$line\n\nBODY\n";
861    
862     $handle->on_read (sub {
863     # print response body
864     print $_[0]->rbuf;
865     $_[0]->rbuf = "";
866     });
867     });
868     }, sub {
869     my ($fh) = @_;
870     # could call $fh->bind etc. here
871 elmex 1.2
872 root 1.7 15
873     };
874 elmex 1.2
875 root 1.34 Example: connect to a UNIX domain socket.
876    
877     tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
878     ...
879     }
880    
881 root 1.7 =cut
882 elmex 1.2
883 root 1.7 sub tcp_connect($$$;$) {
884     my ($host, $port, $connect, $prepare) = @_;
885 elmex 1.2
886 root 1.118 # see http://cr.yp.to/docs/connect.html for some tricky aspects
887 root 1.33 # also http://advogato.org/article/672.html
888 elmex 1.2
889 root 1.7 my %state = ( fh => undef );
890 elmex 1.2
891 root 1.33 # name/service to type/sockaddr resolution
892 root 1.67 resolve_sockaddr $host, $port, 0, 0, undef, sub {
893 root 1.15 my @target = @_;
894 root 1.7
895 root 1.15 $state{next} = sub {
896     return unless exists $state{fh};
897 root 1.7
898 root 1.15 my $target = shift @target
899 root 1.108 or return (%state = (), _postpone $connect);
900 root 1.7
901 root 1.15 my ($domain, $type, $proto, $sockaddr) = @$target;
902 root 1.7
903 root 1.15 # socket creation
904     socket $state{fh}, $domain, $type, $proto
905     or return $state{next}();
906    
907     fh_nonblocking $state{fh}, 1;
908    
909 root 1.27 my $timeout = $prepare && $prepare->($state{fh});
910    
911 root 1.30 $timeout ||= 30 if AnyEvent::WIN32;
912 root 1.15
913 root 1.107 $state{to} = AE::timer $timeout, 0, sub {
914 root 1.90 $! = Errno::ETIMEDOUT;
915 root 1.27 $state{next}();
916 root 1.107 } if $timeout;
917 root 1.7
918 root 1.107 # now connect
919     if (
920     (connect $state{fh}, $sockaddr)
921     || ($! == Errno::EINPROGRESS # POSIX
922     || $! == Errno::EWOULDBLOCK
923     # WSAEINPROGRESS intentionally not checked - it means something else entirely
924     || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt
925     || $! == AnyEvent::Util::WSAEWOULDBLOCK)
926     ) {
927     $state{ww} = AE::io $state{fh}, 1, sub {
928     # we are connected, or maybe there was an error
929     if (my $sin = getpeername $state{fh}) {
930     my ($port, $host) = unpack_sockaddr $sin;
931    
932     delete $state{ww}; delete $state{to};
933    
934     my $guard = guard { %state = () };
935    
936     $connect->(delete $state{fh}, format_address $host, $port, sub {
937     $guard->cancel;
938     $state{next}();
939     });
940     } else {
941 root 1.119 if ($! == Errno::ENOTCONN) {
942     # dummy read to fetch real error code if !cygwin
943     sysread $state{fh}, my $buf, 1;
944    
945     # cygwin 1.5 continously reports "ready' but never delivers
946     # an error with getpeername or sysread.
947     # cygwin 1.7 only reports readyness *once*, but is otherwise
948     # the same, which is atcually more broken.
949     # Work around both by using unportable SO_ERROR for cygwin.
950     $! = (unpack "l", getsockopt $state{fh}, Socket::SOL_SOCKET(), Socket::SO_ERROR()) || Errno::EAGAIN
951     if AnyEvent::CYGWIN && $! == Errno::EAGAIN;
952     }
953 root 1.15
954 root 1.107 return if $! == Errno::EAGAIN; # skip spurious wake-ups
955 root 1.89
956 root 1.107 delete $state{ww}; delete $state{to};
957 root 1.15
958     $state{next}();
959 root 1.107 }
960     };
961 root 1.7 } else {
962 root 1.29 $state{next}();
963 root 1.7 }
964     };
965 elmex 1.1
966 root 1.90 $! = Errno::ENXIO;
967 root 1.15 $state{next}();
968 root 1.7 };
969 elmex 1.1
970 root 1.15 defined wantarray && guard { %state = () }
971 elmex 1.1 }
972    
973 root 1.35 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
974 elmex 1.1
975 root 1.35 Create and bind a stream socket to the given host, and port, set the
976     SO_REUSEADDR flag (if applicable) and call C<listen>. Unlike the name
977     implies, this function can also bind on UNIX domain sockets.
978    
979     For internet sockets, C<$host> must be an IPv4 or IPv6 address (or
980 root 1.38 C<undef>, in which case it binds either to C<0> or to C<::>, depending
981     on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in
982     future versions, as applicable).
983 root 1.21
984     To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
985     wildcard address, use C<::>.
986    
987 root 1.35 The port is specified by C<$service>, which must be either a service name or
988 root 1.21 a numeric port number (or C<0> or C<undef>, in which case an ephemeral
989     port will be used).
990    
991 root 1.35 For UNIX domain sockets, C<$host> must be C<unix/> and C<$service> must be
992     the absolute pathname of the socket. This function will try to C<unlink>
993     the socket before it tries to bind to it. See SECURITY CONSIDERATIONS,
994     below.
995    
996 root 1.21 For each new connection that could be C<accept>ed, call the C<<
997     $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking
998     mode) as first and the peer host and port as second and third arguments
999     (see C<tcp_connect> for details).
1000    
1001     Croaks on any errors it can detect before the listen.
1002 elmex 1.1
1003 root 1.7 If called in non-void context, then this function returns a guard object
1004 root 1.17 whose lifetime it tied to the TCP server: If the object gets destroyed,
1005 root 1.7 the server will be stopped (but existing accepted connections will
1006     continue).
1007 elmex 1.1
1008 root 1.7 If you need more control over the listening socket, you can provide a
1009 root 1.21 C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the
1010     C<listen ()> call, with the listen file handle as first argument, and IP
1011     address and port number of the local socket endpoint as second and third
1012     arguments.
1013 elmex 1.2
1014 root 1.7 It should return the length of the listen queue (or C<0> for the default).
1015 elmex 1.2
1016 root 1.38 Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on
1017     C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack
1018     hosts. Unfortunately, only GNU/Linux seems to implement this properly, so
1019     if you want both IPv4 and IPv6 listening sockets you should create the
1020     IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore
1021     any C<EADDRINUSE> errors.
1022    
1023 root 1.24 Example: bind on some TCP port on the local machine and tell each client
1024 root 1.7 to go away.
1025 elmex 1.2
1026 root 1.24 tcp_server undef, undef, sub {
1027 root 1.7 my ($fh, $host, $port) = @_;
1028 elmex 1.1
1029 root 1.7 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
1030 root 1.24 }, sub {
1031     my ($fh, $thishost, $thisport) = @_;
1032     warn "bound to $thishost, port $thisport\n";
1033 root 1.7 };
1034 elmex 1.1
1035 root 1.67 Example: bind a server on a unix domain socket.
1036    
1037     tcp_server "unix/", "/tmp/mydir/mysocket", sub {
1038     my ($fh) = @_;
1039     };
1040    
1041 root 1.7 =cut
1042 elmex 1.1
1043 root 1.7 sub tcp_server($$$;$) {
1044 root 1.35 my ($host, $service, $accept, $prepare) = @_;
1045 elmex 1.1
1046 root 1.25 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1047 root 1.22 ? "::" : "0"
1048 root 1.21 unless defined $host;
1049    
1050 root 1.34 my $ipn = parse_address $host
1051     or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1052 root 1.21
1053 root 1.35 my $af = address_family $ipn;
1054 root 1.21
1055 root 1.7 my %state;
1056 elmex 1.1
1057 root 1.36 # win32 perl is too stupid to get this right :/
1058     Carp::croak "tcp_server/socket: address family not supported"
1059     if AnyEvent::WIN32 && $af == AF_UNIX;
1060    
1061 root 1.35 socket $state{fh}, $af, SOCK_STREAM, 0
1062 root 1.36 or Carp::croak "tcp_server/socket: $!";
1063 elmex 1.1
1064 root 1.35 if ($af == AF_INET || $af == AF_INET6) {
1065     setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1066 root 1.36 or Carp::croak "tcp_server/so_reuseaddr: $!"
1067 root 1.37 unless AnyEvent::WIN32; # work around windows bug
1068 root 1.35
1069     unless ($service =~ /^\d*$/) {
1070     $service = (getservbyname $service, "tcp")[2]
1071     or Carp::croak "$service: service unknown"
1072     }
1073     } elsif ($af == AF_UNIX) {
1074     unlink $service;
1075     }
1076 elmex 1.1
1077 root 1.35 bind $state{fh}, pack_sockaddr $service, $ipn
1078 root 1.7 or Carp::croak "bind: $!";
1079 elmex 1.1
1080 root 1.7 fh_nonblocking $state{fh}, 1;
1081 elmex 1.1
1082 root 1.21 my $len;
1083    
1084     if ($prepare) {
1085 root 1.35 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1086     $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1087 root 1.21 }
1088    
1089     $len ||= 128;
1090 elmex 1.1
1091 root 1.7 listen $state{fh}, $len
1092     or Carp::croak "listen: $!";
1093 elmex 1.1
1094 root 1.107 $state{aw} = AE::io $state{fh}, 0, sub {
1095 root 1.7 # this closure keeps $state alive
1096 root 1.115 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1097 root 1.7 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1098 root 1.37
1099 root 1.35 my ($service, $host) = unpack_sockaddr $peer;
1100     $accept->($fh, format_address $host, $service);
1101 root 1.7 }
1102 root 1.107 };
1103 elmex 1.1
1104 root 1.7 defined wantarray
1105     ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1106     : ()
1107 elmex 1.1 }
1108    
1109 root 1.7 1;
1110    
1111 elmex 1.1 =back
1112    
1113 root 1.38 =head1 SECURITY CONSIDERATIONS
1114    
1115     This module is quite powerful, with with power comes the ability to abuse
1116     as well: If you accept "hostnames" and ports from untrusted sources,
1117     then note that this can be abused to delete files (host=C<unix/>). This
1118     is not really a problem with this module, however, as blindly accepting
1119     any address and protocol and trying to bind a server or connect to it is
1120     harmful in general.
1121    
1122 elmex 1.1 =head1 AUTHOR
1123    
1124 root 1.7 Marc Lehmann <schmorp@schmorp.de>
1125     http://home.schmorp.de/
1126 elmex 1.1
1127     =cut
1128