ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.146
Committed: Tue Mar 27 23:47:57 2012 UTC (12 years, 3 months ago) by root
Branch: MAIN
Changes since 1.145: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

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