ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.119
Committed: Tue Jan 5 10:45:25 2010 UTC (14 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-5_24
Changes since 1.118: +12 -2 lines
Log Message:
1.24

File Contents

# Content
1 =head1 NAME
2
3 AnyEvent::Socket - useful IPv4 and IPv6 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 # used in cases where we may return immediately but want the
64 # caller to do stuff first
65 sub _postpone {
66 my ($cb, @args) = (@_, $!);
67
68 my $w; $w = AE::timer 0, 0, sub {
69 undef $w;
70 $! = pop @args;
71 $cb->(@args);
72 };
73 }
74
75 =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 return undef if $_[-1] >= 2 ** (8 * (4 - $#_));
96
97 pack "N", (pop)
98 + ($_[0] << 24)
99 + ($_[1] << 16)
100 + ($_[2] << 8);
101 }
102
103 =item $ipn = parse_ipv6 $textual_ipv6_address
104
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 forms supported by parse_ipv4). Note that scope-id's are not supported
110 (and will not parse).
111
112 This function works similarly to C<inet_pton AF_INET6, ...>.
113
114 Example:
115
116 print unpack "H*", parse_ipv6 "2002:5345::10.0.0.1";
117 # => 2002534500000000000000000a000001
118
119 =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 unless (defined $t) {
129 ($h, $t) = (undef, $h);
130 }
131
132 my @h = split /:/, $h;
133 my @t = split /:/, $t;
134
135 # check for ipv4 tail
136 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 return undef unless @h + @t == 8 || $_[0] =~ /::/;
147
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 }
157
158 sub parse_unix($) {
159 $_[0] eq "unix/"
160 ? pack "S", AF_UNIX
161 : undef
162
163 }
164
165 =item $ipn = parse_address $ip
166
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
175 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 Example:
180
181 print unpack "H*", parse_address "10.1.2.3";
182 # => 0a010203
183
184 =item $ipn = AnyEvent::Socket::aton $ip
185
186 Same as C<parse_address>, but not exported (think C<Socket::inet_aton> but
187 I<without> name resolution).
188
189 =cut
190
191 sub parse_address($) {
192 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 }
201
202 *aton = \&parse_address;
203
204 =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 Example: get the protocol number for TCP (usually 6)
211
212 my $proto = getprotobyname "tcp";
213
214 =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 =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 empty list. The same happens when a parse error was detected, such as a
259 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 for ("$_[0]") { # work on a copy, just in case, and also reset pos
278
279 # parse host, special cases: "ipv6" or "ipv6 port"
280 unless (
281 ($host) = /^\s* ([0-9a-fA-F:]*:[0-9a-fA-F:]*:[0-9a-fA-F\.:]*)/xgc
282 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 =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 =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
342 =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 =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
361 This function works similarly to C<inet_ntop AF_INET || AF_INET6, ...>,
362 except it automatically detects the address type.
363
364 Returns C<undef> if it cannot detect the type.
365
366 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 Example:
371
372 print format_address "\x01\x02\x03\x05";
373 => 1.2.3.5
374
375 =item $text = AnyEvent::Socket::ntoa $ipn
376
377 Same as format_address, but not exported (think C<inet_ntoa>).
378
379 =cut
380
381 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 sub format_address($) {
416 my $af = address_family $_[0];
417 if ($af == AF_INET) {
418 return &format_ipv4;
419 } elsif ($af == AF_INET6) {
420 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 } elsif ($af == AF_UNIX) {
424 return "unix/"
425 } else {
426 return undef
427 }
428 }
429
430 *ntoa = \&format_address;
431
432 =item inet_aton $name_or_address, $cb->(@addresses)
433
434 Works similarly to its Socket counterpart, except that it uses a
435 callback. Use the length to distinguish between ipv4 and ipv6 (4 octets
436 for IPv4, 16 for IPv6), or use C<format_address> to convert it to a more
437 readable format.
438
439 Note that C<resolve_sockaddr>, while initially a more complex interface,
440 resolves host addresses, IDNs, service names and SRV records and gives you
441 an ordered list of socket addresses to try and should be preferred over
442 C<inet_aton>.
443
444 Example.
445
446 inet_aton "www.google.com", my $cv = AE::cv;
447 say unpack "H*", $_
448 for $cv->recv;
449 # => d155e363
450 # => d155e367 etc.
451
452 inet_aton "ipv6.google.com", my $cv = AE::cv;
453 say unpack "H*", $_
454 for $cv->recv;
455 # => 20014860a00300000000000000000068
456
457 =cut
458
459 sub inet_aton {
460 my ($name, $cb) = @_;
461
462 if (my $ipn = &parse_ipv4) {
463 $cb->($ipn);
464 } elsif (my $ipn = &parse_ipv6) {
465 $cb->($ipn);
466 } elsif ($name eq "localhost") { # rfc2606 et al.
467 $cb->(v127.0.0.1, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1);
468 } else {
469 require AnyEvent::DNS;
470
471 my $ipv4 = $AnyEvent::PROTOCOL{ipv4};
472 my $ipv6 = $AnyEvent::PROTOCOL{ipv6};
473
474 my @res;
475
476 my $cv = AE::cv {
477 $cb->(map @$_, reverse @res);
478 };
479
480 $cv->begin;
481
482 if ($ipv4) {
483 $cv->begin;
484 AnyEvent::DNS::a ($name, sub {
485 $res[$ipv4] = [map &parse_ipv4, @_];
486 $cv->end;
487 });
488 };
489
490 if ($ipv6) {
491 $cv->begin;
492 AnyEvent::DNS::aaaa ($name, sub {
493 $res[$ipv6] = [map &parse_ipv6, @_];
494 $cv->end;
495 });
496 };
497
498 $cv->end;
499 }
500 }
501
502 BEGIN {
503 *sockaddr_family = $Socket::VERSION >= 1.75
504 ? \&Socket::sockaddr_family
505 : # for 5.6.x, we need to do something much more horrible
506 (Socket::pack_sockaddr_in 0x5555, "\x55\x55\x55\x55"
507 | eval { Socket::pack_sockaddr_un "U" }) =~ /^\x00/
508 ? sub { unpack "xC", $_[0] }
509 : sub { unpack "S" , $_[0] };
510 }
511
512 # check for broken platforms with an extra field in sockaddr structure
513 # kind of a rfc vs. bsd issue, as usual (ok, normally it's a
514 # unix vs. bsd issue, a iso C vs. bsd issue or simply a
515 # correctness vs. bsd issue.)
516 my $pack_family = 0x55 == sockaddr_family ("\x55\x55")
517 ? "xC" : "S";
518
519 =item $sa = AnyEvent::Socket::pack_sockaddr $service, $host
520
521 Pack the given port/host combination into a binary sockaddr
522 structure. Handles both IPv4 and IPv6 host addresses, as well as UNIX
523 domain sockets (C<$host> == C<unix/> and C<$service> == absolute
524 pathname).
525
526 Example:
527
528 my $bind = AnyEvent::Socket::pack_sockaddr 43, v195.234.53.120;
529 bind $socket, $bind
530 or die "bind: $!";
531
532 =cut
533
534 sub pack_sockaddr($$) {
535 my $af = address_family $_[1];
536
537 if ($af == AF_INET) {
538 Socket::pack_sockaddr_in $_[0], $_[1]
539 } elsif ($af == AF_INET6) {
540 pack "$pack_family nL a16 L",
541 AF_INET6,
542 $_[0], # port
543 0, # flowinfo
544 $_[1], # addr
545 0 # scope id
546 } elsif ($af == AF_UNIX) {
547 Socket::pack_sockaddr_un $_[0]
548 } else {
549 Carp::croak "pack_sockaddr: invalid host";
550 }
551 }
552
553 =item ($service, $host) = AnyEvent::Socket::unpack_sockaddr $sa
554
555 Unpack the given binary sockaddr structure (as used by bind, getpeername
556 etc.) into a C<$service, $host> combination.
557
558 For IPv4 and IPv6, C<$service> is the port number and C<$host> the host
559 address in network format (binary).
560
561 For UNIX domain sockets, C<$service> is the absolute pathname and C<$host>
562 is a special token that is understood by the other functions in this
563 module (C<format_address> converts it to C<unix/>).
564
565 =cut
566
567 # perl contains a bug (imho) where it requires that the kernel always returns
568 # sockaddr_un structures of maximum length (which is not, AFAICS, required
569 # by any standard). try to 0-pad structures for the benefit of those platforms.
570
571 my $sa_un_zero = eval { Socket::pack_sockaddr_un "" }; $sa_un_zero ^= $sa_un_zero;
572
573 sub unpack_sockaddr($) {
574 my $af = sockaddr_family $_[0];
575
576 if ($af == AF_INET) {
577 Socket::unpack_sockaddr_in $_[0]
578 } elsif ($af == AF_INET6) {
579 unpack "x2 n x4 a16", $_[0]
580 } elsif ($af == AF_UNIX) {
581 ((Socket::unpack_sockaddr_un $_[0] ^ $sa_un_zero), pack "S", AF_UNIX)
582 } else {
583 Carp::croak "unpack_sockaddr: unsupported protocol family $af";
584 }
585 }
586
587 =item resolve_sockaddr $node, $service, $proto, $family, $type, $cb->([$family, $type, $proto, $sockaddr], ...)
588
589 Tries to resolve the given nodename and service name into protocol families
590 and sockaddr structures usable to connect to this node and service in a
591 protocol-independent way. It works remotely similar to the getaddrinfo
592 posix function.
593
594 For internet addresses, C<$node> is either an IPv4 or IPv6 address, an
595 internet hostname (DNS domain name or IDN), and C<$service> is either
596 a service name (port name from F</etc/services>) or a numerical port
597 number. If both C<$node> and C<$service> are names, then SRV records
598 will be consulted to find the real service, otherwise they will be
599 used as-is. If you know that the service name is not in your services
600 database, then you can specify the service in the format C<name=port>
601 (e.g. C<http=80>).
602
603 For UNIX domain sockets, C<$node> must be the string C<unix/> and
604 C<$service> must be the absolute pathname of the socket. In this case,
605 C<$proto> will be ignored.
606
607 C<$proto> must be a protocol name, currently C<tcp>, C<udp> or
608 C<sctp>. The default is currently C<tcp>, but in the future, this function
609 might try to use other protocols such as C<sctp>, depending on the socket
610 type and any SRV records it might find.
611
612 C<$family> must be either C<0> (meaning any protocol is OK), C<4> (use
613 only IPv4) or C<6> (use only IPv6). The default is influenced by
614 C<$ENV{PERL_ANYEVENT_PROTOCOLS}>.
615
616 C<$type> must be C<SOCK_STREAM>, C<SOCK_DGRAM> or C<SOCK_SEQPACKET> (or
617 C<undef> in which case it gets automatically chosen to be C<SOCK_STREAM>
618 unless C<$proto> is C<udp>).
619
620 The callback will receive zero or more array references that contain
621 C<$family, $type, $proto> for use in C<socket> and a binary
622 C<$sockaddr> for use in C<connect> (or C<bind>).
623
624 The application should try these in the order given.
625
626 Example:
627
628 resolve_sockaddr "google.com", "http", 0, undef, undef, sub { ... };
629
630 =cut
631
632 sub resolve_sockaddr($$$$$$) {
633 my ($node, $service, $proto, $family, $type, $cb) = @_;
634
635 if ($node eq "unix/") {
636 return $cb->() if $family || $service !~ /^\//; # no can do
637
638 return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
639 }
640
641 unless (AF_INET6) {
642 $family != 6
643 or return $cb->();
644
645 $family = 4;
646 }
647
648 $cb->() if $family == 4 && !$AnyEvent::PROTOCOL{ipv4};
649 $cb->() if $family == 6 && !$AnyEvent::PROTOCOL{ipv6};
650
651 $family ||= 4 unless $AnyEvent::PROTOCOL{ipv6};
652 $family ||= 6 unless $AnyEvent::PROTOCOL{ipv4};
653
654 $proto ||= "tcp";
655 $type ||= $proto eq "udp" ? SOCK_DGRAM : SOCK_STREAM;
656
657 my $proton = getprotobyname $proto
658 or Carp::croak "$proto: protocol unknown";
659
660 my $port;
661
662 if ($service =~ /^(\S+)=(\d+)$/) {
663 ($service, $port) = ($1, $2);
664 } elsif ($service =~ /^\d+$/) {
665 ($service, $port) = (undef, $service);
666 } else {
667 $port = (getservbyname $service, $proto)[2]
668 or Carp::croak "$service/$proto: service unknown";
669 }
670
671 # resolve a records / provide sockaddr structures
672 my $resolve = sub {
673 my @target = @_;
674
675 my @res;
676 my $cv = AE::cv {
677 $cb->(
678 map $_->[2],
679 sort {
680 $AnyEvent::PROTOCOL{$b->[1]} <=> $AnyEvent::PROTOCOL{$a->[1]}
681 or $a->[0] <=> $b->[0]
682 }
683 @res
684 )
685 };
686
687 $cv->begin;
688 for my $idx (0 .. $#target) {
689 my ($node, $port) = @{ $target[$idx] };
690
691 if (my $noden = parse_address $node) {
692 my $af = address_family $noden;
693
694 if ($af == AF_INET && $family != 6) {
695 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
696 pack_sockaddr $port, $noden]]
697 }
698
699 if ($af == AF_INET6 && $family != 4) {
700 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
701 pack_sockaddr $port, $noden]]
702 }
703 } else {
704 # ipv4
705 if ($family != 6) {
706 $cv->begin;
707 AnyEvent::DNS::a $node, sub {
708 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
709 pack_sockaddr $port, parse_ipv4 $_]]
710 for @_;
711 $cv->end;
712 };
713 }
714
715 # ipv6
716 if ($family != 4) {
717 $cv->begin;
718 AnyEvent::DNS::aaaa $node, sub {
719 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
720 pack_sockaddr $port, parse_ipv6 $_]]
721 for @_;
722 $cv->end;
723 };
724 }
725 }
726 }
727 $cv->end;
728 };
729
730 $node = AnyEvent::Util::idn_to_ascii $node
731 if $node =~ /[^\x00-\x7f]/;
732
733 # try srv records, if applicable
734 if ($node eq "localhost") {
735 $resolve->(["127.0.0.1", $port], ["::1", $port]);
736 } elsif (defined $service && !parse_address $node) {
737 AnyEvent::DNS::srv $service, $proto, $node, sub {
738 my (@srv) = @_;
739
740 if (@srv) {
741 # the only srv record has "." ("" here) => abort
742 $srv[0][2] ne "" || $#srv
743 or return $cb->();
744
745 # use srv records then
746 $resolve->(
747 map ["$_->[3].", $_->[2]],
748 grep $_->[3] ne ".",
749 @srv
750 );
751 } else {
752 # no srv records, continue traditionally
753 $resolve->([$node, $port]);
754 }
755 };
756 } else {
757 # most common case
758 $resolve->([$node, $port]);
759 }
760 }
761
762 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
763
764 This is a convenience function that creates a TCP socket and makes a
765 100% non-blocking connect to the given C<$host> (which can be a DNS/IDN
766 hostname or a textual IP address, or the string C<unix/> for UNIX domain
767 sockets) and C<$service> (which can be a numeric port number or a service
768 name, or a C<servicename=portnumber> string, or the pathname to a UNIX
769 domain socket).
770
771 If both C<$host> and C<$port> are names, then this function will use SRV
772 records to locate the real target(s).
773
774 In either case, it will create a list of target hosts (e.g. for multihomed
775 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
776 each in turn.
777
778 After the connection is established, then the C<$connect_cb> will be
779 invoked with the socket file handle (in non-blocking mode) as first and
780 the peer host (as a textual IP address) and peer port as second and third
781 arguments, respectively. The fourth argument is a code reference that you
782 can call if, for some reason, you don't like this connection, which will
783 cause C<tcp_connect> to try the next one (or call your callback without
784 any arguments if there are no more connections). In most cases, you can
785 simply ignore this argument.
786
787 $cb->($filehandle, $host, $port, $retry)
788
789 If the connect is unsuccessful, then the C<$connect_cb> will be invoked
790 without any arguments and C<$!> will be set appropriately (with C<ENXIO>
791 indicating a DNS resolution failure).
792
793 The callback will I<never> be invoked before C<tcp_connect> returns, even
794 if C<tcp_connect> was able to connect immediately (e.g. on unix domain
795 sockets).
796
797 The file handle is perfect for being plugged into L<AnyEvent::Handle>, but
798 can be used as a normal perl file handle as well.
799
800 Unless called in void context, C<tcp_connect> returns a guard object that
801 will automatically abort connecting when it gets destroyed (it does not do
802 anything to the socket after the connect was successful).
803
804 Sometimes you need to "prepare" the socket before connecting, for example,
805 to C<bind> it to some port, or you want a specific connect timeout that
806 is lower than your kernel's default timeout. In this case you can specify
807 a second callback, C<$prepare_cb>. It will be called with the file handle
808 in not-yet-connected state as only argument and must return the connection
809 timeout value (or C<0>, C<undef> or the empty list to indicate the default
810 timeout is to be used).
811
812 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
813 socket (although only IPv4 is currently supported by this module).
814
815 Note to the poor Microsoft Windows users: Windows (of course) doesn't
816 correctly signal connection errors, so unless your event library works
817 around this, failed connections will simply hang. The only event libraries
818 that handle this condition correctly are L<EV> and L<Glib>. Additionally,
819 AnyEvent works around this bug with L<Event> and in its pure-perl
820 backend. All other libraries cannot correctly handle this condition. To
821 lessen the impact of this windows bug, a default timeout of 30 seconds
822 will be imposed on windows. Cygwin is not affected.
823
824 Simple Example: connect to localhost on port 22.
825
826 tcp_connect localhost => 22, sub {
827 my $fh = shift
828 or die "unable to connect: $!";
829 # do something
830 };
831
832 Complex Example: connect to www.google.com on port 80 and make a simple
833 GET request without much error handling. Also limit the connection timeout
834 to 15 seconds.
835
836 tcp_connect "www.google.com", "http",
837 sub {
838 my ($fh) = @_
839 or die "unable to connect: $!";
840
841 my $handle; # avoid direct assignment so on_eof has it in scope.
842 $handle = new AnyEvent::Handle
843 fh => $fh,
844 on_error => sub {
845 warn "error $_[2]\n";
846 $_[0]->destroy;
847 },
848 on_eof => sub {
849 $handle->destroy; # destroy handle
850 warn "done.\n";
851 };
852
853 $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
854
855 $handle->push_read (line => "\015\012\015\012", sub {
856 my ($handle, $line) = @_;
857
858 # print response header
859 print "HEADER\n$line\n\nBODY\n";
860
861 $handle->on_read (sub {
862 # print response body
863 print $_[0]->rbuf;
864 $_[0]->rbuf = "";
865 });
866 });
867 }, sub {
868 my ($fh) = @_;
869 # could call $fh->bind etc. here
870
871 15
872 };
873
874 Example: connect to a UNIX domain socket.
875
876 tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
877 ...
878 }
879
880 =cut
881
882 sub tcp_connect($$$;$) {
883 my ($host, $port, $connect, $prepare) = @_;
884
885 # see http://cr.yp.to/docs/connect.html for some tricky aspects
886 # also http://advogato.org/article/672.html
887
888 my %state = ( fh => undef );
889
890 # name/service to type/sockaddr resolution
891 resolve_sockaddr $host, $port, 0, 0, undef, sub {
892 my @target = @_;
893
894 $state{next} = sub {
895 return unless exists $state{fh};
896
897 my $target = shift @target
898 or return (%state = (), _postpone $connect);
899
900 my ($domain, $type, $proto, $sockaddr) = @$target;
901
902 # socket creation
903 socket $state{fh}, $domain, $type, $proto
904 or return $state{next}();
905
906 fh_nonblocking $state{fh}, 1;
907
908 my $timeout = $prepare && $prepare->($state{fh});
909
910 $timeout ||= 30 if AnyEvent::WIN32;
911
912 $state{to} = AE::timer $timeout, 0, sub {
913 $! = Errno::ETIMEDOUT;
914 $state{next}();
915 } if $timeout;
916
917 # now connect
918 if (
919 (connect $state{fh}, $sockaddr)
920 || ($! == Errno::EINPROGRESS # POSIX
921 || $! == Errno::EWOULDBLOCK
922 # WSAEINPROGRESS intentionally not checked - it means something else entirely
923 || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt
924 || $! == AnyEvent::Util::WSAEWOULDBLOCK)
925 ) {
926 $state{ww} = AE::io $state{fh}, 1, sub {
927 # we are connected, or maybe there was an error
928 if (my $sin = getpeername $state{fh}) {
929 my ($port, $host) = unpack_sockaddr $sin;
930
931 delete $state{ww}; delete $state{to};
932
933 my $guard = guard { %state = () };
934
935 $connect->(delete $state{fh}, format_address $host, $port, sub {
936 $guard->cancel;
937 $state{next}();
938 });
939 } else {
940 if ($! == Errno::ENOTCONN) {
941 # dummy read to fetch real error code if !cygwin
942 sysread $state{fh}, my $buf, 1;
943
944 # cygwin 1.5 continously reports "ready' but never delivers
945 # an error with getpeername or sysread.
946 # cygwin 1.7 only reports readyness *once*, but is otherwise
947 # the same, which is atcually more broken.
948 # Work around both by using unportable SO_ERROR for cygwin.
949 $! = (unpack "l", getsockopt $state{fh}, Socket::SOL_SOCKET(), Socket::SO_ERROR()) || Errno::EAGAIN
950 if AnyEvent::CYGWIN && $! == Errno::EAGAIN;
951 }
952
953 return if $! == Errno::EAGAIN; # skip spurious wake-ups
954
955 delete $state{ww}; delete $state{to};
956
957 $state{next}();
958 }
959 };
960 } else {
961 $state{next}();
962 }
963 };
964
965 $! = Errno::ENXIO;
966 $state{next}();
967 };
968
969 defined wantarray && guard { %state = () }
970 }
971
972 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
973
974 Create and bind a stream socket to the given host, and port, set the
975 SO_REUSEADDR flag (if applicable) and call C<listen>. Unlike the name
976 implies, this function can also bind on UNIX domain sockets.
977
978 For internet sockets, C<$host> must be an IPv4 or IPv6 address (or
979 C<undef>, in which case it binds either to C<0> or to C<::>, depending
980 on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in
981 future versions, as applicable).
982
983 To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
984 wildcard address, use C<::>.
985
986 The port is specified by C<$service>, which must be either a service name or
987 a numeric port number (or C<0> or C<undef>, in which case an ephemeral
988 port will be used).
989
990 For UNIX domain sockets, C<$host> must be C<unix/> and C<$service> must be
991 the absolute pathname of the socket. This function will try to C<unlink>
992 the socket before it tries to bind to it. See SECURITY CONSIDERATIONS,
993 below.
994
995 For each new connection that could be C<accept>ed, call the C<<
996 $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking
997 mode) as first and the peer host and port as second and third arguments
998 (see C<tcp_connect> for details).
999
1000 Croaks on any errors it can detect before the listen.
1001
1002 If called in non-void context, then this function returns a guard object
1003 whose lifetime it tied to the TCP server: If the object gets destroyed,
1004 the server will be stopped (but existing accepted connections will
1005 continue).
1006
1007 If you need more control over the listening socket, you can provide a
1008 C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the
1009 C<listen ()> call, with the listen file handle as first argument, and IP
1010 address and port number of the local socket endpoint as second and third
1011 arguments.
1012
1013 It should return the length of the listen queue (or C<0> for the default).
1014
1015 Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on
1016 C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack
1017 hosts. Unfortunately, only GNU/Linux seems to implement this properly, so
1018 if you want both IPv4 and IPv6 listening sockets you should create the
1019 IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore
1020 any C<EADDRINUSE> errors.
1021
1022 Example: bind on some TCP port on the local machine and tell each client
1023 to go away.
1024
1025 tcp_server undef, undef, sub {
1026 my ($fh, $host, $port) = @_;
1027
1028 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
1029 }, sub {
1030 my ($fh, $thishost, $thisport) = @_;
1031 warn "bound to $thishost, port $thisport\n";
1032 };
1033
1034 Example: bind a server on a unix domain socket.
1035
1036 tcp_server "unix/", "/tmp/mydir/mysocket", sub {
1037 my ($fh) = @_;
1038 };
1039
1040 =cut
1041
1042 sub tcp_server($$$;$) {
1043 my ($host, $service, $accept, $prepare) = @_;
1044
1045 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1046 ? "::" : "0"
1047 unless defined $host;
1048
1049 my $ipn = parse_address $host
1050 or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1051
1052 my $af = address_family $ipn;
1053
1054 my %state;
1055
1056 # win32 perl is too stupid to get this right :/
1057 Carp::croak "tcp_server/socket: address family not supported"
1058 if AnyEvent::WIN32 && $af == AF_UNIX;
1059
1060 socket $state{fh}, $af, SOCK_STREAM, 0
1061 or Carp::croak "tcp_server/socket: $!";
1062
1063 if ($af == AF_INET || $af == AF_INET6) {
1064 setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1065 or Carp::croak "tcp_server/so_reuseaddr: $!"
1066 unless AnyEvent::WIN32; # work around windows bug
1067
1068 unless ($service =~ /^\d*$/) {
1069 $service = (getservbyname $service, "tcp")[2]
1070 or Carp::croak "$service: service unknown"
1071 }
1072 } elsif ($af == AF_UNIX) {
1073 unlink $service;
1074 }
1075
1076 bind $state{fh}, pack_sockaddr $service, $ipn
1077 or Carp::croak "bind: $!";
1078
1079 fh_nonblocking $state{fh}, 1;
1080
1081 my $len;
1082
1083 if ($prepare) {
1084 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1085 $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1086 }
1087
1088 $len ||= 128;
1089
1090 listen $state{fh}, $len
1091 or Carp::croak "listen: $!";
1092
1093 $state{aw} = AE::io $state{fh}, 0, sub {
1094 # this closure keeps $state alive
1095 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1096 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1097
1098 my ($service, $host) = unpack_sockaddr $peer;
1099 $accept->($fh, format_address $host, $service);
1100 }
1101 };
1102
1103 defined wantarray
1104 ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1105 : ()
1106 }
1107
1108 1;
1109
1110 =back
1111
1112 =head1 SECURITY CONSIDERATIONS
1113
1114 This module is quite powerful, with with power comes the ability to abuse
1115 as well: If you accept "hostnames" and ports from untrusted sources,
1116 then note that this can be abused to delete files (host=C<unix/>). This
1117 is not really a problem with this module, however, as blindly accepting
1118 any address and protocol and trying to bind a server or connect to it is
1119 harmful in general.
1120
1121 =head1 AUTHOR
1122
1123 Marc Lehmann <schmorp@schmorp.de>
1124 http://home.schmorp.de/
1125
1126 =cut
1127