ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.116
Committed: Sat Nov 28 13:43:47 2009 UTC (14 years, 7 months ago) by root
Branch: MAIN
Changes since 1.115: +33 -0 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     if (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 eq $_[0]) {
387     return "::";
388     } elsif (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1 eq $_[0]) {
389     return "::1";
390     } elsif (v0.0.0.0.0.0.0.0.0.0.0.0 eq substr $_[0], 0, 12) {
391     # v4compatible
392     return "::" . format_ipv4 substr $_[0], 12;
393     } elsif (v0.0.0.0.0.0.0.0.0.0.255.255 eq substr $_[0], 0, 12) {
394     # v4mapped
395     return "::ffff:" . format_ipv4 substr $_[0], 12;
396     } elsif (v0.0.0.0.0.0.0.0.255.255.0.0 eq substr $_[0], 0, 12) {
397     # v4translated
398     return "::ffff:0:" . format_ipv4 substr $_[0], 12;
399     } else {
400     my $ip = sprintf "%x:%x:%x:%x:%x:%x:%x:%x", unpack "n8", $_[0];
401    
402     # this is rather sucky, I admit
403     $ip =~ s/^0:(?:0:)*(0$)?/::/
404     or $ip =~ s/(:0){7}$/::/ or $ip =~ s/(:0){7}/:/
405     or $ip =~ s/(:0){6}$/::/ or $ip =~ s/(:0){6}/:/
406     or $ip =~ s/(:0){5}$/::/ or $ip =~ s/(:0){5}/:/
407     or $ip =~ s/(:0){4}$/::/ or $ip =~ s/(:0){4}/:/
408     or $ip =~ s/(:0){3}$/::/ or $ip =~ s/(:0){3}/:/
409     or $ip =~ s/(:0){2}$/::/ or $ip =~ s/(:0){2}/:/
410     or $ip =~ s/(:0){1}$/::/ or $ip =~ s/(:0){1}/:/;
411     return $ip
412     }
413     }
414    
415 root 1.34 sub format_address($) {
416     my $af = address_family $_[0];
417     if ($af == AF_INET) {
418 root 1.81 return &format_ipv4;
419 root 1.34 } elsif ($af == AF_INET6) {
420 root 1.81 return (v0.0.0.0.0.0.0.0.0.0.255.255 eq substr $_[0], 0, 12)
421     ? format_ipv4 substr $_[0], 12
422     : &format_ipv6;
423 root 1.34 } elsif ($af == AF_UNIX) {
424     return "unix/"
425 root 1.11 } else {
426     return undef
427     }
428     }
429    
430 root 1.58 *ntoa = \&format_address;
431 root 1.34
432 root 1.7 =item inet_aton $name_or_address, $cb->(@addresses)
433 elmex 1.1
434 root 1.7 Works similarly to its Socket counterpart, except that it uses a
435     callback. Also, if a host has only an IPv6 address, this might be passed
436     to the callback instead (use the length to detect this - 4 for IPv4, 16
437     for IPv6).
438 elmex 1.2
439 root 1.7 Unlike the L<Socket> function of the same name, you can get multiple IPv4
440 root 1.34 and IPv6 addresses as result (and maybe even other adrdess types).
441 elmex 1.2
442 root 1.116 Example.
443    
444     inet_aton "www.google.com", my $cv = AE::cv;
445     say unpack "H*", $_
446     for $cv->recv;
447     # => d155e363
448     # => d155e367 etc.
449    
450 root 1.7 =cut
451 elmex 1.2
452 root 1.7 sub inet_aton {
453     my ($name, $cb) = @_;
454 elmex 1.2
455 root 1.9 if (my $ipn = &parse_ipv4) {
456     $cb->($ipn);
457     } elsif (my $ipn = &parse_ipv6) {
458     $cb->($ipn);
459 root 1.7 } elsif ($name eq "localhost") { # rfc2606 et al.
460 root 1.9 $cb->(v127.0.0.1, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1);
461 root 1.7 } else {
462     require AnyEvent::DNS;
463 elmex 1.2
464 root 1.7 # simple, bad suboptimal algorithm
465     AnyEvent::DNS::a ($name, sub {
466     if (@_) {
467 root 1.9 $cb->(map +(parse_ipv4 $_), @_);
468 root 1.7 } else {
469 root 1.8 $cb->();
470     #AnyEvent::DNS::aaaa ($name, $cb); need inet_pton
471 root 1.7 }
472     });
473     }
474     }
475 elmex 1.2
476 root 1.95 BEGIN {
477     *sockaddr_family = $Socket::VERSION >= 1.75
478     ? \&Socket::sockaddr_family
479     : # for 5.6.x, we need to do something much more horrible
480     (Socket::pack_sockaddr_in 0x5555, "\x55\x55\x55\x55"
481     | eval { Socket::pack_sockaddr_un "U" }) =~ /^\x00/
482     ? sub { unpack "xC", $_[0] }
483     : sub { unpack "S" , $_[0] };
484     }
485    
486 root 1.32 # check for broken platforms with extra field in sockaddr structure
487     # kind of a rfc vs. bsd issue, as usual (ok, normally it's a
488     # unix vs. bsd issue, a iso C vs. bsd issue or simply a
489 root 1.95 # correctness vs. bsd issue.)
490     my $pack_family = 0x55 == sockaddr_family ("\x55\x55")
491 root 1.32 ? "xC" : "S";
492    
493 root 1.34 =item $sa = AnyEvent::Socket::pack_sockaddr $service, $host
494 root 1.15
495 root 1.34 Pack the given port/host combination into a binary sockaddr
496     structure. Handles both IPv4 and IPv6 host addresses, as well as UNIX
497     domain sockets (C<$host> == C<unix/> and C<$service> == absolute
498     pathname).
499 root 1.15
500 root 1.116 Example:
501    
502     my $bind = AnyEvent::Socket::pack_sockaddr 43, v195.234.53.120;
503     bind $socket, $bind
504     or die "bind: $!";
505    
506 root 1.15 =cut
507    
508     sub pack_sockaddr($$) {
509 root 1.34 my $af = address_family $_[1];
510    
511     if ($af == AF_INET) {
512 root 1.15 Socket::pack_sockaddr_in $_[0], $_[1]
513 root 1.34 } elsif ($af == AF_INET6) {
514 root 1.32 pack "$pack_family nL a16 L",
515 root 1.21 AF_INET6,
516 root 1.15 $_[0], # port
517     0, # flowinfo
518     $_[1], # addr
519     0 # scope id
520 root 1.34 } elsif ($af == AF_UNIX) {
521     Socket::pack_sockaddr_un $_[0]
522 root 1.15 } else {
523     Carp::croak "pack_sockaddr: invalid host";
524     }
525     }
526    
527 root 1.34 =item ($service, $host) = AnyEvent::Socket::unpack_sockaddr $sa
528 root 1.15
529     Unpack the given binary sockaddr structure (as used by bind, getpeername
530 root 1.34 etc.) into a C<$service, $host> combination.
531    
532     For IPv4 and IPv6, C<$service> is the port number and C<$host> the host
533     address in network format (binary).
534 root 1.15
535 root 1.34 For UNIX domain sockets, C<$service> is the absolute pathname and C<$host>
536     is a special token that is understood by the other functions in this
537     module (C<format_address> converts it to C<unix/>).
538 root 1.15
539     =cut
540    
541 root 1.113 # perl contains a bug (imho) where it requires that the kernel always returns
542     # sockaddr_un structures of maximum length (which is not, AFAICS, required
543     # by any standard). try to 0-pad structures for the benefit of those platforms.
544    
545 root 1.114 my $sa_un_zero = eval { Socket::pack_sockaddr_un "" }; $sa_un_zero ^= $sa_un_zero;
546 root 1.113
547 root 1.15 sub unpack_sockaddr($) {
548 root 1.95 my $af = sockaddr_family $_[0];
549 root 1.15
550 root 1.23 if ($af == AF_INET) {
551 root 1.15 Socket::unpack_sockaddr_in $_[0]
552 root 1.21 } elsif ($af == AF_INET6) {
553     unpack "x2 n x4 a16", $_[0]
554 root 1.34 } elsif ($af == AF_UNIX) {
555 root 1.113 ((Socket::unpack_sockaddr_un $_[0] ^ $sa_un_zero), pack "S", AF_UNIX)
556 root 1.15 } else {
557     Carp::croak "unpack_sockaddr: unsupported protocol family $af";
558     }
559     }
560    
561 root 1.34 =item resolve_sockaddr $node, $service, $proto, $family, $type, $cb->([$family, $type, $proto, $sockaddr], ...)
562    
563     Tries to resolve the given nodename and service name into protocol families
564     and sockaddr structures usable to connect to this node and service in a
565     protocol-independent way. It works remotely similar to the getaddrinfo
566     posix function.
567    
568     For internet addresses, C<$node> is either an IPv4 or IPv6 address or an
569     internet hostname, and C<$service> is either a service name (port name
570     from F</etc/services>) or a numerical port number. If both C<$node> and
571     C<$service> are names, then SRV records will be consulted to find the real
572     service, otherwise they will be used as-is. If you know that the service
573     name is not in your services database, then you can specify the service in
574     the format C<name=port> (e.g. C<http=80>).
575    
576     For UNIX domain sockets, C<$node> must be the string C<unix/> and
577     C<$service> must be the absolute pathname of the socket. In this case,
578     C<$proto> will be ignored.
579    
580     C<$proto> must be a protocol name, currently C<tcp>, C<udp> or
581     C<sctp>. The default is currently C<tcp>, but in the future, this function
582     might try to use other protocols such as C<sctp>, depending on the socket
583     type and any SRV records it might find.
584    
585     C<$family> must be either C<0> (meaning any protocol is OK), C<4> (use
586 root 1.67 only IPv4) or C<6> (use only IPv6). The default is influenced by
587 root 1.34 C<$ENV{PERL_ANYEVENT_PROTOCOLS}>.
588    
589     C<$type> must be C<SOCK_STREAM>, C<SOCK_DGRAM> or C<SOCK_SEQPACKET> (or
590 root 1.67 C<undef> in which case it gets automatically chosen to be C<SOCK_STREAM>
591     unless C<$proto> is C<udp>).
592 root 1.34
593     The callback will receive zero or more array references that contain
594     C<$family, $type, $proto> for use in C<socket> and a binary
595     C<$sockaddr> for use in C<connect> (or C<bind>).
596    
597     The application should try these in the order given.
598    
599     Example:
600    
601     resolve_sockaddr "google.com", "http", 0, undef, undef, sub { ... };
602    
603     =cut
604    
605     sub resolve_sockaddr($$$$$$) {
606     my ($node, $service, $proto, $family, $type, $cb) = @_;
607    
608     if ($node eq "unix/") {
609 root 1.67 return $cb->() if $family || $service !~ /^\//; # no can do
610 root 1.34
611 root 1.67 return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
612 root 1.34 }
613    
614     unless (AF_INET6) {
615     $family != 6
616     or return $cb->();
617    
618     $family = 4;
619     }
620    
621     $cb->() if $family == 4 && !$AnyEvent::PROTOCOL{ipv4};
622     $cb->() if $family == 6 && !$AnyEvent::PROTOCOL{ipv6};
623    
624     $family ||= 4 unless $AnyEvent::PROTOCOL{ipv6};
625     $family ||= 6 unless $AnyEvent::PROTOCOL{ipv4};
626    
627     $proto ||= "tcp";
628     $type ||= $proto eq "udp" ? SOCK_DGRAM : SOCK_STREAM;
629    
630 root 1.93 my $proton = getprotobyname $proto
631 root 1.34 or Carp::croak "$proto: protocol unknown";
632    
633     my $port;
634    
635     if ($service =~ /^(\S+)=(\d+)$/) {
636     ($service, $port) = ($1, $2);
637     } elsif ($service =~ /^\d+$/) {
638     ($service, $port) = (undef, $service);
639     } else {
640     $port = (getservbyname $service, $proto)[2]
641 root 1.35 or Carp::croak "$service/$proto: service unknown";
642 root 1.34 }
643    
644     my @target = [$node, $port];
645    
646     # resolve a records / provide sockaddr structures
647     my $resolve = sub {
648     my @res;
649 root 1.107 my $cv = AE::cv {
650 root 1.34 $cb->(
651     map $_->[2],
652     sort {
653     $AnyEvent::PROTOCOL{$b->[1]} <=> $AnyEvent::PROTOCOL{$a->[1]}
654     or $a->[0] <=> $b->[0]
655     }
656     @res
657     )
658 root 1.107 };
659 root 1.34
660     $cv->begin;
661     for my $idx (0 .. $#target) {
662     my ($node, $port) = @{ $target[$idx] };
663    
664     if (my $noden = parse_address $node) {
665 root 1.40 my $af = address_family $noden;
666    
667     if ($af == AF_INET && $family != 6) {
668 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
669     pack_sockaddr $port, $noden]]
670     }
671    
672 root 1.40 if ($af == AF_INET6 && $family != 4) {
673 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
674     pack_sockaddr $port, $noden]]
675     }
676     } else {
677     # ipv4
678     if ($family != 6) {
679     $cv->begin;
680 root 1.39 AnyEvent::DNS::a $node, sub {
681 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
682     pack_sockaddr $port, parse_ipv4 $_]]
683     for @_;
684     $cv->end;
685     };
686     }
687    
688     # ipv6
689     if ($family != 4) {
690     $cv->begin;
691 root 1.39 AnyEvent::DNS::aaaa $node, sub {
692 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
693     pack_sockaddr $port, parse_ipv6 $_]]
694     for @_;
695     $cv->end;
696     };
697     }
698     }
699     }
700     $cv->end;
701     };
702    
703     # try srv records, if applicable
704     if ($node eq "localhost") {
705     @target = (["127.0.0.1", $port], ["::1", $port]);
706     &$resolve;
707     } elsif (defined $service && !parse_address $node) {
708 root 1.39 AnyEvent::DNS::srv $service, $proto, $node, sub {
709 root 1.34 my (@srv) = @_;
710    
711     # no srv records, continue traditionally
712     @srv
713     or return &$resolve;
714    
715 root 1.43 # the only srv record has "." ("" here) => abort
716 root 1.42 $srv[0][2] ne "" || $#srv
717 root 1.34 or return $cb->();
718    
719     # use srv records then
720     @target = map ["$_->[3].", $_->[2]],
721     grep $_->[3] ne ".",
722     @srv;
723    
724     &$resolve;
725     };
726     } else {
727     &$resolve;
728     }
729     }
730    
731 root 1.15 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
732 elmex 1.1
733 root 1.15 This is a convenience function that creates a TCP socket and makes a 100%
734 root 1.34 non-blocking connect to the given C<$host> (which can be a hostname or
735     a textual IP address, or the string C<unix/> for UNIX domain sockets)
736     and C<$service> (which can be a numeric port number or a service name,
737     or a C<servicename=portnumber> string, or the pathname to a UNIX domain
738     socket).
739 root 1.7
740 root 1.8 If both C<$host> and C<$port> are names, then this function will use SRV
741 root 1.15 records to locate the real target(s).
742 root 1.8
743 root 1.15 In either case, it will create a list of target hosts (e.g. for multihomed
744 root 1.17 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
745 root 1.15 each in turn.
746 root 1.7
747 root 1.108 After the connection is established, then the C<$connect_cb> will be
748     invoked with the socket file handle (in non-blocking mode) as first and
749     the peer host (as a textual IP address) and peer port as second and third
750     arguments, respectively. The fourth argument is a code reference that you
751     can call if, for some reason, you don't like this connection, which will
752     cause C<tcp_connect> to try the next one (or call your callback without
753     any arguments if there are no more connections). In most cases, you can
754     simply ignore this argument.
755 root 1.15
756     $cb->($filehandle, $host, $port, $retry)
757 root 1.7
758     If the connect is unsuccessful, then the C<$connect_cb> will be invoked
759     without any arguments and C<$!> will be set appropriately (with C<ENXIO>
760 root 1.17 indicating a DNS resolution failure).
761 root 1.7
762 root 1.108 The callback will I<never> be invoked before C<tcp_connect> returns, even
763     if C<tcp_connect> was able to connect immediately (e.g. on unix domain
764     sockets).
765    
766 root 1.17 The file handle is perfect for being plugged into L<AnyEvent::Handle>, but
767     can be used as a normal perl file handle as well.
768 root 1.7
769 root 1.15 Unless called in void context, C<tcp_connect> returns a guard object that
770     will automatically abort connecting when it gets destroyed (it does not do
771     anything to the socket after the connect was successful).
772    
773 root 1.7 Sometimes you need to "prepare" the socket before connecting, for example,
774     to C<bind> it to some port, or you want a specific connect timeout that
775     is lower than your kernel's default timeout. In this case you can specify
776     a second callback, C<$prepare_cb>. It will be called with the file handle
777     in not-yet-connected state as only argument and must return the connection
778     timeout value (or C<0>, C<undef> or the empty list to indicate the default
779     timeout is to be used).
780    
781 root 1.17 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
782 root 1.7 socket (although only IPv4 is currently supported by this module).
783    
784 root 1.28 Note to the poor Microsoft Windows users: Windows (of course) doesn't
785     correctly signal connection errors, so unless your event library works
786     around this, failed connections will simply hang. The only event libraries
787     that handle this condition correctly are L<EV> and L<Glib>. Additionally,
788     AnyEvent works around this bug with L<Event> and in its pure-perl
789     backend. All other libraries cannot correctly handle this condition. To
790     lessen the impact of this windows bug, a default timeout of 30 seconds
791     will be imposed on windows. Cygwin is not affected.
792 root 1.27
793 root 1.7 Simple Example: connect to localhost on port 22.
794    
795 root 1.45 tcp_connect localhost => 22, sub {
796     my $fh = shift
797     or die "unable to connect: $!";
798     # do something
799     };
800 root 1.7
801     Complex Example: connect to www.google.com on port 80 and make a simple
802     GET request without much error handling. Also limit the connection timeout
803     to 15 seconds.
804    
805     tcp_connect "www.google.com", "http",
806     sub {
807     my ($fh) = @_
808     or die "unable to connect: $!";
809    
810     my $handle; # avoid direct assignment so on_eof has it in scope.
811     $handle = new AnyEvent::Handle
812     fh => $fh,
813 root 1.90 on_error => sub {
814     warn "error $_[2]\n";
815 root 1.91 $_[0]->destroy;
816 root 1.90 },
817 root 1.7 on_eof => sub {
818 root 1.90 $handle->destroy; # destroy handle
819 root 1.7 warn "done.\n";
820     };
821    
822     $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
823    
824 elmex 1.111 $handle->push_read (line => "\015\012\015\012", sub {
825 root 1.7 my ($handle, $line) = @_;
826    
827     # print response header
828     print "HEADER\n$line\n\nBODY\n";
829    
830     $handle->on_read (sub {
831     # print response body
832     print $_[0]->rbuf;
833     $_[0]->rbuf = "";
834     });
835     });
836     }, sub {
837     my ($fh) = @_;
838     # could call $fh->bind etc. here
839 elmex 1.2
840 root 1.7 15
841     };
842 elmex 1.2
843 root 1.34 Example: connect to a UNIX domain socket.
844    
845     tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
846     ...
847     }
848    
849 root 1.7 =cut
850 elmex 1.2
851 root 1.7 sub tcp_connect($$$;$) {
852     my ($host, $port, $connect, $prepare) = @_;
853 elmex 1.2
854 root 1.7 # see http://cr.yp.to/docs/connect.html for some background
855 root 1.33 # also http://advogato.org/article/672.html
856 elmex 1.2
857 root 1.7 my %state = ( fh => undef );
858 elmex 1.2
859 root 1.33 # name/service to type/sockaddr resolution
860 root 1.67 resolve_sockaddr $host, $port, 0, 0, undef, sub {
861 root 1.15 my @target = @_;
862 root 1.7
863 root 1.15 $state{next} = sub {
864     return unless exists $state{fh};
865 root 1.7
866 root 1.15 my $target = shift @target
867 root 1.108 or return (%state = (), _postpone $connect);
868 root 1.7
869 root 1.15 my ($domain, $type, $proto, $sockaddr) = @$target;
870 root 1.7
871 root 1.15 # socket creation
872     socket $state{fh}, $domain, $type, $proto
873     or return $state{next}();
874    
875     fh_nonblocking $state{fh}, 1;
876    
877 root 1.27 my $timeout = $prepare && $prepare->($state{fh});
878    
879 root 1.30 $timeout ||= 30 if AnyEvent::WIN32;
880 root 1.15
881 root 1.107 $state{to} = AE::timer $timeout, 0, sub {
882 root 1.90 $! = Errno::ETIMEDOUT;
883 root 1.27 $state{next}();
884 root 1.107 } if $timeout;
885 root 1.7
886 root 1.107 # now connect
887     if (
888     (connect $state{fh}, $sockaddr)
889     || ($! == Errno::EINPROGRESS # POSIX
890     || $! == Errno::EWOULDBLOCK
891     # WSAEINPROGRESS intentionally not checked - it means something else entirely
892     || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt
893     || $! == AnyEvent::Util::WSAEWOULDBLOCK)
894     ) {
895     $state{ww} = AE::io $state{fh}, 1, sub {
896     # we are connected, or maybe there was an error
897     if (my $sin = getpeername $state{fh}) {
898     my ($port, $host) = unpack_sockaddr $sin;
899    
900     delete $state{ww}; delete $state{to};
901    
902     my $guard = guard { %state = () };
903    
904     $connect->(delete $state{fh}, format_address $host, $port, sub {
905     $guard->cancel;
906     $state{next}();
907     });
908     } else {
909     # dummy read to fetch real error code
910     sysread $state{fh}, my $buf, 1 if $! == Errno::ENOTCONN;
911 root 1.15
912 root 1.107 return if $! == Errno::EAGAIN; # skip spurious wake-ups
913 root 1.89
914 root 1.107 delete $state{ww}; delete $state{to};
915 root 1.15
916     $state{next}();
917 root 1.107 }
918     };
919 root 1.7 } else {
920 root 1.29 $state{next}();
921 root 1.7 }
922     };
923 elmex 1.1
924 root 1.90 $! = Errno::ENXIO;
925 root 1.15 $state{next}();
926 root 1.7 };
927 elmex 1.1
928 root 1.15 defined wantarray && guard { %state = () }
929 elmex 1.1 }
930    
931 root 1.35 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
932 elmex 1.1
933 root 1.35 Create and bind a stream socket to the given host, and port, set the
934     SO_REUSEADDR flag (if applicable) and call C<listen>. Unlike the name
935     implies, this function can also bind on UNIX domain sockets.
936    
937     For internet sockets, C<$host> must be an IPv4 or IPv6 address (or
938 root 1.38 C<undef>, in which case it binds either to C<0> or to C<::>, depending
939     on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in
940     future versions, as applicable).
941 root 1.21
942     To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
943     wildcard address, use C<::>.
944    
945 root 1.35 The port is specified by C<$service>, which must be either a service name or
946 root 1.21 a numeric port number (or C<0> or C<undef>, in which case an ephemeral
947     port will be used).
948    
949 root 1.35 For UNIX domain sockets, C<$host> must be C<unix/> and C<$service> must be
950     the absolute pathname of the socket. This function will try to C<unlink>
951     the socket before it tries to bind to it. See SECURITY CONSIDERATIONS,
952     below.
953    
954 root 1.21 For each new connection that could be C<accept>ed, call the C<<
955     $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking
956     mode) as first and the peer host and port as second and third arguments
957     (see C<tcp_connect> for details).
958    
959     Croaks on any errors it can detect before the listen.
960 elmex 1.1
961 root 1.7 If called in non-void context, then this function returns a guard object
962 root 1.17 whose lifetime it tied to the TCP server: If the object gets destroyed,
963 root 1.7 the server will be stopped (but existing accepted connections will
964     continue).
965 elmex 1.1
966 root 1.7 If you need more control over the listening socket, you can provide a
967 root 1.21 C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the
968     C<listen ()> call, with the listen file handle as first argument, and IP
969     address and port number of the local socket endpoint as second and third
970     arguments.
971 elmex 1.2
972 root 1.7 It should return the length of the listen queue (or C<0> for the default).
973 elmex 1.2
974 root 1.38 Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on
975     C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack
976     hosts. Unfortunately, only GNU/Linux seems to implement this properly, so
977     if you want both IPv4 and IPv6 listening sockets you should create the
978     IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore
979     any C<EADDRINUSE> errors.
980    
981 root 1.24 Example: bind on some TCP port on the local machine and tell each client
982 root 1.7 to go away.
983 elmex 1.2
984 root 1.24 tcp_server undef, undef, sub {
985 root 1.7 my ($fh, $host, $port) = @_;
986 elmex 1.1
987 root 1.7 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
988 root 1.24 }, sub {
989     my ($fh, $thishost, $thisport) = @_;
990     warn "bound to $thishost, port $thisport\n";
991 root 1.7 };
992 elmex 1.1
993 root 1.67 Example: bind a server on a unix domain socket.
994    
995     tcp_server "unix/", "/tmp/mydir/mysocket", sub {
996     my ($fh) = @_;
997     };
998    
999 root 1.7 =cut
1000 elmex 1.1
1001 root 1.7 sub tcp_server($$$;$) {
1002 root 1.35 my ($host, $service, $accept, $prepare) = @_;
1003 elmex 1.1
1004 root 1.25 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1005 root 1.22 ? "::" : "0"
1006 root 1.21 unless defined $host;
1007    
1008 root 1.34 my $ipn = parse_address $host
1009     or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1010 root 1.21
1011 root 1.35 my $af = address_family $ipn;
1012 root 1.21
1013 root 1.7 my %state;
1014 elmex 1.1
1015 root 1.36 # win32 perl is too stupid to get this right :/
1016     Carp::croak "tcp_server/socket: address family not supported"
1017     if AnyEvent::WIN32 && $af == AF_UNIX;
1018    
1019 root 1.35 socket $state{fh}, $af, SOCK_STREAM, 0
1020 root 1.36 or Carp::croak "tcp_server/socket: $!";
1021 elmex 1.1
1022 root 1.35 if ($af == AF_INET || $af == AF_INET6) {
1023     setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1024 root 1.36 or Carp::croak "tcp_server/so_reuseaddr: $!"
1025 root 1.37 unless AnyEvent::WIN32; # work around windows bug
1026 root 1.35
1027     unless ($service =~ /^\d*$/) {
1028     $service = (getservbyname $service, "tcp")[2]
1029     or Carp::croak "$service: service unknown"
1030     }
1031     } elsif ($af == AF_UNIX) {
1032     unlink $service;
1033     }
1034 elmex 1.1
1035 root 1.35 bind $state{fh}, pack_sockaddr $service, $ipn
1036 root 1.7 or Carp::croak "bind: $!";
1037 elmex 1.1
1038 root 1.7 fh_nonblocking $state{fh}, 1;
1039 elmex 1.1
1040 root 1.21 my $len;
1041    
1042     if ($prepare) {
1043 root 1.35 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1044     $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1045 root 1.21 }
1046    
1047     $len ||= 128;
1048 elmex 1.1
1049 root 1.7 listen $state{fh}, $len
1050     or Carp::croak "listen: $!";
1051 elmex 1.1
1052 root 1.107 $state{aw} = AE::io $state{fh}, 0, sub {
1053 root 1.7 # this closure keeps $state alive
1054 root 1.115 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1055 root 1.7 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1056 root 1.37
1057 root 1.35 my ($service, $host) = unpack_sockaddr $peer;
1058     $accept->($fh, format_address $host, $service);
1059 root 1.7 }
1060 root 1.107 };
1061 elmex 1.1
1062 root 1.7 defined wantarray
1063     ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1064     : ()
1065 elmex 1.1 }
1066    
1067 root 1.7 1;
1068    
1069 elmex 1.1 =back
1070    
1071 root 1.38 =head1 SECURITY CONSIDERATIONS
1072    
1073     This module is quite powerful, with with power comes the ability to abuse
1074     as well: If you accept "hostnames" and ports from untrusted sources,
1075     then note that this can be abused to delete files (host=C<unix/>). This
1076     is not really a problem with this module, however, as blindly accepting
1077     any address and protocol and trying to bind a server or connect to it is
1078     harmful in general.
1079    
1080 elmex 1.1 =head1 AUTHOR
1081    
1082 root 1.7 Marc Lehmann <schmorp@schmorp.de>
1083     http://home.schmorp.de/
1084 elmex 1.1
1085     =cut
1086