ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.144
Committed: Thu Mar 22 00:48:22 2012 UTC (12 years, 3 months ago) by root
Branch: MAIN
Changes since 1.143: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.7 =head1 NAME
2 elmex 1.1
3 root 1.135 AnyEvent::Socket - useful IPv4 and IPv6 stuff. also unix domain sockets. and 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 root 1.9 =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 root 1.51 return undef if $_[-1] >= 2 ** (8 * (4 - $#_));
84 root 1.9
85     pack "N", (pop)
86     + ($_[0] << 24)
87     + ($_[1] << 16)
88     + ($_[2] << 8);
89     }
90    
91 root 1.14 =item $ipn = parse_ipv6 $textual_ipv6_address
92 root 1.9
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 root 1.26 forms supported by parse_ipv4). Note that scope-id's are not supported
98     (and will not parse).
99 root 1.12
100     This function works similarly to C<inet_pton AF_INET6, ...>.
101 root 1.9
102 root 1.116 Example:
103    
104     print unpack "H*", parse_ipv6 "2002:5345::10.0.0.1";
105     # => 2002534500000000000000000a000001
106    
107 root 1.9 =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 root 1.11 unless (defined $t) {
117 root 1.9 ($h, $t) = (undef, $h);
118     }
119    
120     my @h = split /:/, $h;
121     my @t = split /:/, $t;
122    
123 root 1.14 # check for ipv4 tail
124 root 1.9 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 root 1.11 return undef unless @h + @t == 8 || $_[0] =~ /::/;
135 root 1.9
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 root 1.7 }
145 elmex 1.1
146 root 1.134 =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 root 1.34 sub parse_unix($) {
158     $_[0] eq "unix/"
159     ? pack "S", AF_UNIX
160     : undef
161 root 1.11
162 root 1.34 }
163    
164 root 1.81 =item $ipn = parse_address $ip
165 root 1.34
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 root 1.11
174 root 1.81 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 root 1.116 Example:
179    
180     print unpack "H*", parse_address "10.1.2.3";
181     # => 0a010203
182    
183 root 1.81 =item $ipn = AnyEvent::Socket::aton $ip
184 root 1.58
185     Same as C<parse_address>, but not exported (think C<Socket::inet_aton> but
186     I<without> name resolution).
187    
188 root 1.11 =cut
189    
190 root 1.34 sub parse_address($) {
191 root 1.81 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 root 1.11 }
200    
201 root 1.58 *aton = \&parse_address;
202 root 1.34
203 root 1.93 =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 root 1.116 Example: get the protocol number for TCP (usually 6)
210    
211     my $proto = getprotobyname "tcp";
212    
213 root 1.93 =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 root 1.54 =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 root 1.134 C<parse_unix>), and strings starting with C</> will also be interpreted as
246     unix domain sockets.
247 root 1.54
248 root 1.134 hostname:port e.g. "www.linux.org", "www.x.de:443", "www.x.de:https=443",
249 root 1.54 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 root 1.134 unix/:path e.g. "unix/:/path/to/socket"
255     /path e.g. "/path/to/socket"
256 root 1.54
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 root 1.102 empty list. The same happens when a parse error was detected, such as a
261 root 1.54 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 root 1.134 print join ",", parse_host_port "/tmp/debug.sock";
275     # => "unix/", "/tmp/debug.sock"
276    
277 root 1.54 =cut
278    
279     sub parse_hostport($;$) {
280     my ($host, $port);
281    
282 root 1.56 for ("$_[0]") { # work on a copy, just in case, and also reset pos
283 root 1.55
284 root 1.134 # shortcut for /path
285     return ("unix/", $_)
286     if m%^/%;
287    
288 root 1.54 # parse host, special cases: "ipv6" or "ipv6 port"
289     unless (
290 root 1.55 ($host) = /^\s* ([0-9a-fA-F:]*:[0-9a-fA-F:]*:[0-9a-fA-F\.:]*)/xgc
291 root 1.54 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 root 1.134
313 root 1.54 }
314    
315     # hostnames must not contain :'s
316     return if $host =~ /:/ && !parse_ipv6 $host;
317    
318     ($host, $port)
319     }
320    
321 root 1.103 =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 root 1.34 =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 root 1.11
352 root 1.81 =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 root 1.34 =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 root 1.11
371 root 1.12 This function works similarly to C<inet_ntop AF_INET || AF_INET6, ...>,
372     except it automatically detects the address type.
373    
374 root 1.34 Returns C<undef> if it cannot detect the type.
375    
376 root 1.81 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 root 1.116 Example:
381    
382     print format_address "\x01\x02\x03\x05";
383     => 1.2.3.5
384    
385 root 1.58 =item $text = AnyEvent::Socket::ntoa $ipn
386    
387     Same as format_address, but not exported (think C<inet_ntoa>).
388    
389 root 1.11 =cut
390    
391 root 1.81 sub format_ipv4($) {
392     join ".", unpack "C4", $_[0]
393     }
394    
395     sub format_ipv6($) {
396 root 1.120 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 root 1.81
424 root 1.120 $ip
425 root 1.81 }
426    
427 root 1.34 sub format_address($) {
428 root 1.120 if (4 == length $_[0]) {
429 root 1.81 return &format_ipv4;
430 root 1.120 } 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 root 1.81 : &format_ipv6;
434 root 1.120 } elsif (AF_UNIX == address_family $_[0]) {
435 root 1.34 return "unix/"
436 root 1.11 } else {
437     return undef
438     }
439     }
440    
441 root 1.58 *ntoa = \&format_address;
442 root 1.34
443 root 1.7 =item inet_aton $name_or_address, $cb->(@addresses)
444 elmex 1.1
445 root 1.7 Works similarly to its Socket counterpart, except that it uses a
446 root 1.117 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 root 1.118 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 root 1.117 C<inet_aton>.
454 elmex 1.2
455 root 1.116 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 root 1.117 inet_aton "ipv6.google.com", my $cv = AE::cv;
464     say unpack "H*", $_
465     for $cv->recv;
466     # => 20014860a00300000000000000000068
467    
468 root 1.7 =cut
469 elmex 1.2
470 root 1.7 sub inet_aton {
471     my ($name, $cb) = @_;
472 elmex 1.2
473 root 1.9 if (my $ipn = &parse_ipv4) {
474     $cb->($ipn);
475     } elsif (my $ipn = &parse_ipv6) {
476     $cb->($ipn);
477 root 1.7 } elsif ($name eq "localhost") { # rfc2606 et al.
478 root 1.9 $cb->(v127.0.0.1, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1);
479 root 1.7 } else {
480 root 1.141 require AnyEvent::DNS unless $AnyEvent::DNS::VERSION;
481 elmex 1.2
482 root 1.117 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 root 1.7 }
511     }
512 elmex 1.2
513 root 1.95 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 root 1.117 # check for broken platforms with an extra field in sockaddr structure
524 root 1.32 # 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 root 1.95 # correctness vs. bsd issue.)
527     my $pack_family = 0x55 == sockaddr_family ("\x55\x55")
528 root 1.32 ? "xC" : "S";
529    
530 root 1.34 =item $sa = AnyEvent::Socket::pack_sockaddr $service, $host
531 root 1.15
532 root 1.34 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 root 1.15
537 root 1.116 Example:
538    
539     my $bind = AnyEvent::Socket::pack_sockaddr 43, v195.234.53.120;
540     bind $socket, $bind
541     or die "bind: $!";
542    
543 root 1.15 =cut
544    
545     sub pack_sockaddr($$) {
546 root 1.34 my $af = address_family $_[1];
547    
548     if ($af == AF_INET) {
549 root 1.15 Socket::pack_sockaddr_in $_[0], $_[1]
550 root 1.34 } elsif ($af == AF_INET6) {
551 root 1.32 pack "$pack_family nL a16 L",
552 root 1.21 AF_INET6,
553 root 1.15 $_[0], # port
554     0, # flowinfo
555     $_[1], # addr
556     0 # scope id
557 root 1.34 } elsif ($af == AF_UNIX) {
558     Socket::pack_sockaddr_un $_[0]
559 root 1.15 } else {
560     Carp::croak "pack_sockaddr: invalid host";
561     }
562     }
563    
564 root 1.34 =item ($service, $host) = AnyEvent::Socket::unpack_sockaddr $sa
565 root 1.15
566     Unpack the given binary sockaddr structure (as used by bind, getpeername
567 root 1.34 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 root 1.15
572 root 1.34 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 root 1.15
576     =cut
577    
578 root 1.113 # 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 root 1.114 my $sa_un_zero = eval { Socket::pack_sockaddr_un "" }; $sa_un_zero ^= $sa_un_zero;
583 root 1.113
584 root 1.15 sub unpack_sockaddr($) {
585 root 1.95 my $af = sockaddr_family $_[0];
586 root 1.15
587 root 1.23 if ($af == AF_INET) {
588 root 1.15 Socket::unpack_sockaddr_in $_[0]
589 root 1.21 } elsif ($af == AF_INET6) {
590     unpack "x2 n x4 a16", $_[0]
591 root 1.34 } elsif ($af == AF_UNIX) {
592 root 1.113 ((Socket::unpack_sockaddr_un $_[0] ^ $sa_un_zero), pack "S", AF_UNIX)
593 root 1.15 } else {
594     Carp::croak "unpack_sockaddr: unsupported protocol family $af";
595     }
596     }
597    
598 root 1.34 =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 root 1.118 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 root 1.34
614 root 1.137 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 root 1.136
620 root 1.34 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 root 1.67 only IPv4) or C<6> (use only IPv6). The default is influenced by
631 root 1.34 C<$ENV{PERL_ANYEVENT_PROTOCOLS}>.
632    
633     C<$type> must be C<SOCK_STREAM>, C<SOCK_DGRAM> or C<SOCK_SEQPACKET> (or
634 root 1.67 C<undef> in which case it gets automatically chosen to be C<SOCK_STREAM>
635     unless C<$proto> is C<udp>).
636 root 1.34
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 root 1.136 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 root 1.137 y/A-Z/a-z/;
672 root 1.136
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 root 1.34 sub resolve_sockaddr($$$$$$) {
689     my ($node, $service, $proto, $family, $type, $cb) = @_;
690    
691     if ($node eq "unix/") {
692 root 1.67 return $cb->() if $family || $service !~ /^\//; # no can do
693 root 1.34
694 root 1.67 return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
695 root 1.34 }
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 root 1.124 my $proton = AnyEvent::Socket::getprotobyname $proto
714 root 1.34 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 root 1.35 or Carp::croak "$service/$proto: service unknown";
725 root 1.34 }
726    
727     # resolve a records / provide sockaddr structures
728     my $resolve = sub {
729 root 1.118 my @target = @_;
730    
731 root 1.34 my @res;
732 root 1.107 my $cv = AE::cv {
733 root 1.34 $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 root 1.107 };
742 root 1.34
743     $cv->begin;
744     for my $idx (0 .. $#target) {
745     my ($node, $port) = @{ $target[$idx] };
746    
747     if (my $noden = parse_address $node) {
748 root 1.40 my $af = address_family $noden;
749    
750     if ($af == AF_INET && $family != 6) {
751 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
752     pack_sockaddr $port, $noden]]
753     }
754    
755 root 1.40 if ($af == AF_INET6 && $family != 4) {
756 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
757     pack_sockaddr $port, $noden]]
758     }
759 root 1.137 } else {
760     $node =~ y/A-Z/a-z/;
761    
762     my $hosts = $HOSTS{$node};
763 root 1.136
764 root 1.137 # a records
765 root 1.34 if ($family != 6) {
766     $cv->begin;
767 root 1.39 AnyEvent::DNS::a $node, sub {
768 root 1.136 push @res, [$idx, "ipv4", [AF_INET , $type, $proton, pack_sockaddr $port, parse_ipv4 $_]]
769 root 1.34 for @_;
770 root 1.137
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 root 1.34 $cv->end;
778     };
779     }
780    
781 root 1.137 # aaaa records
782 root 1.34 if ($family != 4) {
783     $cv->begin;
784 root 1.39 AnyEvent::DNS::aaaa $node, sub {
785 root 1.136 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, parse_ipv6 $_]]
786 root 1.34 for @_;
787 root 1.137
788 root 1.138 push @res,
789     map [$idx + 0.5, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, $_]],
790     @{ $hosts->[1] }
791     unless @_;
792 root 1.137
793 root 1.34 $cv->end;
794     };
795     }
796     }
797     }
798     $cv->end;
799     };
800    
801 root 1.118 $node = AnyEvent::Util::idn_to_ascii $node
802     if $node =~ /[^\x00-\x7f]/;
803    
804 root 1.136 # parse hosts
805     if (defined $HOSTS) {
806     _parse_hosts;
807     undef &_parse_hosts;
808     }
809    
810 root 1.34 # try srv records, if applicable
811     if ($node eq "localhost") {
812 root 1.118 $resolve->(["127.0.0.1", $port], ["::1", $port]);
813 root 1.34 } elsif (defined $service && !parse_address $node) {
814 root 1.39 AnyEvent::DNS::srv $service, $proto, $node, sub {
815 root 1.34 my (@srv) = @_;
816    
817 root 1.118 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 root 1.34 };
833     } else {
834 root 1.118 # most common case
835     $resolve->([$node, $port]);
836 root 1.34 }
837     }
838    
839 root 1.15 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
840 elmex 1.1
841 root 1.118 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 root 1.7
848 root 1.8 If both C<$host> and C<$port> are names, then this function will use SRV
849 root 1.15 records to locate the real target(s).
850 root 1.8
851 root 1.15 In either case, it will create a list of target hosts (e.g. for multihomed
852 root 1.17 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
853 root 1.15 each in turn.
854 root 1.7
855 root 1.108 After the connection is established, then the C<$connect_cb> will be
856 root 1.128 invoked with the socket file handle (in non-blocking mode) as first, and
857 root 1.108 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 root 1.15
864     $cb->($filehandle, $host, $port, $retry)
865 root 1.7
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 root 1.17 indicating a DNS resolution failure).
869 root 1.7
870 root 1.108 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 root 1.17 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 root 1.7
877 root 1.15 Unless called in void context, C<tcp_connect> returns a guard object that
878 root 1.122 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 root 1.15
883 root 1.7 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 root 1.17 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
892 root 1.7 socket (although only IPv4 is currently supported by this module).
893    
894 root 1.28 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 root 1.27
903 root 1.7 Simple Example: connect to localhost on port 22.
904    
905 root 1.45 tcp_connect localhost => 22, sub {
906     my $fh = shift
907     or die "unable to connect: $!";
908     # do something
909     };
910 root 1.7
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 root 1.90 on_error => sub {
924 root 1.144 AE::log error => $_[2];
925 root 1.91 $_[0]->destroy;
926 root 1.90 },
927 root 1.7 on_eof => sub {
928 root 1.90 $handle->destroy; # destroy handle
929 root 1.139 AE::log info => "done.";
930 root 1.7 };
931    
932     $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
933    
934 elmex 1.111 $handle->push_read (line => "\015\012\015\012", sub {
935 root 1.7 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 elmex 1.2
950 root 1.7 15
951     };
952 elmex 1.2
953 root 1.34 Example: connect to a UNIX domain socket.
954    
955     tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
956     ...
957     }
958    
959 root 1.7 =cut
960 elmex 1.2
961 root 1.7 sub tcp_connect($$$;$) {
962     my ($host, $port, $connect, $prepare) = @_;
963 elmex 1.2
964 root 1.118 # see http://cr.yp.to/docs/connect.html for some tricky aspects
965 root 1.33 # also http://advogato.org/article/672.html
966 elmex 1.2
967 root 1.7 my %state = ( fh => undef );
968 elmex 1.2
969 root 1.33 # name/service to type/sockaddr resolution
970 root 1.67 resolve_sockaddr $host, $port, 0, 0, undef, sub {
971 root 1.15 my @target = @_;
972 root 1.7
973 root 1.15 $state{next} = sub {
974     return unless exists $state{fh};
975 root 1.7
976 root 1.142 my $errno = $!;
977 root 1.15 my $target = shift @target
978 root 1.132 or return AE::postpone {
979 root 1.123 return unless exists $state{fh};
980     %state = ();
981 root 1.142 $! = $errno;
982 root 1.123 $connect->();
983     };
984 root 1.7
985 root 1.15 my ($domain, $type, $proto, $sockaddr) = @$target;
986 root 1.7
987 root 1.15 # socket creation
988     socket $state{fh}, $domain, $type, $proto
989     or return $state{next}();
990    
991     fh_nonblocking $state{fh}, 1;
992    
993 root 1.27 my $timeout = $prepare && $prepare->($state{fh});
994    
995 root 1.30 $timeout ||= 30 if AnyEvent::WIN32;
996 root 1.15
997 root 1.107 $state{to} = AE::timer $timeout, 0, sub {
998 root 1.90 $! = Errno::ETIMEDOUT;
999 root 1.27 $state{next}();
1000 root 1.107 } if $timeout;
1001 root 1.7
1002 root 1.107 # 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 root 1.119 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 root 1.130 # the same, which is actually more broken.
1033 root 1.119 # 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 root 1.15
1038 root 1.107 return if $! == Errno::EAGAIN; # skip spurious wake-ups
1039 root 1.89
1040 root 1.107 delete $state{ww}; delete $state{to};
1041 root 1.15
1042     $state{next}();
1043 root 1.107 }
1044     };
1045 root 1.7 } else {
1046 root 1.29 $state{next}();
1047 root 1.7 }
1048     };
1049 elmex 1.1
1050 root 1.90 $! = Errno::ENXIO;
1051 root 1.15 $state{next}();
1052 root 1.7 };
1053 elmex 1.1
1054 root 1.15 defined wantarray && guard { %state = () }
1055 elmex 1.1 }
1056    
1057 root 1.35 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
1058 elmex 1.1
1059 root 1.140 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 root 1.35 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 root 1.38 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 root 1.21
1068     To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
1069     wildcard address, use C<::>.
1070    
1071 root 1.140 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 root 1.21 port will be used).
1074    
1075 root 1.35 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 root 1.133 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 root 1.35
1080 root 1.21 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 root 1.128 mode) as first, and the peer host and port as second and third arguments
1083 root 1.21 (see C<tcp_connect> for details).
1084    
1085     Croaks on any errors it can detect before the listen.
1086 elmex 1.1
1087 root 1.7 If called in non-void context, then this function returns a guard object
1088 root 1.17 whose lifetime it tied to the TCP server: If the object gets destroyed,
1089 root 1.7 the server will be stopped (but existing accepted connections will
1090 root 1.129 not be affected).
1091 elmex 1.1
1092 root 1.143 Regardless, when the function returns to the caller, the socket is bound
1093     and in listening state.
1094    
1095 root 1.7 If you need more control over the listening socket, you can provide a
1096 root 1.21 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 elmex 1.2
1101 root 1.7 It should return the length of the listen queue (or C<0> for the default).
1102 elmex 1.2
1103 root 1.38 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 root 1.24 Example: bind on some TCP port on the local machine and tell each client
1111 root 1.7 to go away.
1112 elmex 1.2
1113 root 1.24 tcp_server undef, undef, sub {
1114 root 1.7 my ($fh, $host, $port) = @_;
1115 elmex 1.1
1116 root 1.7 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
1117 root 1.24 }, sub {
1118     my ($fh, $thishost, $thisport) = @_;
1119 root 1.139 AE::log info => "bound to $thishost, port $thisport";
1120 root 1.7 };
1121 elmex 1.1
1122 root 1.67 Example: bind a server on a unix domain socket.
1123    
1124     tcp_server "unix/", "/tmp/mydir/mysocket", sub {
1125     my ($fh) = @_;
1126     };
1127    
1128 root 1.7 =cut
1129 elmex 1.1
1130 root 1.7 sub tcp_server($$$;$) {
1131 root 1.35 my ($host, $service, $accept, $prepare) = @_;
1132 elmex 1.1
1133 root 1.25 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1134 root 1.22 ? "::" : "0"
1135 root 1.21 unless defined $host;
1136    
1137 root 1.34 my $ipn = parse_address $host
1138     or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1139 root 1.21
1140 root 1.35 my $af = address_family $ipn;
1141 root 1.21
1142 root 1.7 my %state;
1143 elmex 1.1
1144 root 1.36 # 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 root 1.35 socket $state{fh}, $af, SOCK_STREAM, 0
1149 root 1.36 or Carp::croak "tcp_server/socket: $!";
1150 elmex 1.1
1151 root 1.35 if ($af == AF_INET || $af == AF_INET6) {
1152     setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1153 root 1.36 or Carp::croak "tcp_server/so_reuseaddr: $!"
1154 root 1.37 unless AnyEvent::WIN32; # work around windows bug
1155 root 1.35
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 elmex 1.1
1164 root 1.35 bind $state{fh}, pack_sockaddr $service, $ipn
1165 root 1.7 or Carp::croak "bind: $!";
1166 elmex 1.1
1167 root 1.133 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 root 1.7 fh_nonblocking $state{fh}, 1;
1178 elmex 1.1
1179 root 1.21 my $len;
1180    
1181     if ($prepare) {
1182 root 1.35 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1183     $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1184 root 1.21 }
1185    
1186     $len ||= 128;
1187 elmex 1.1
1188 root 1.7 listen $state{fh}, $len
1189     or Carp::croak "listen: $!";
1190 elmex 1.1
1191 root 1.107 $state{aw} = AE::io $state{fh}, 0, sub {
1192 root 1.7 # this closure keeps $state alive
1193 root 1.115 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1194 root 1.7 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1195 root 1.37
1196 root 1.35 my ($service, $host) = unpack_sockaddr $peer;
1197     $accept->($fh, format_address $host, $service);
1198 root 1.7 }
1199 root 1.107 };
1200 elmex 1.1
1201 root 1.7 defined wantarray
1202     ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1203     : ()
1204 elmex 1.1 }
1205    
1206 root 1.125 =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 root 1.126 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 root 1.125
1227     =cut
1228    
1229     sub tcp_congestion($$) {
1230 root 1.127 defined TCP_CONGESTION
1231     ? setsockopt $_[0], Socket::IPPROTO_TCP (), TCP_CONGESTION, "$_[1]"
1232 root 1.125 : undef
1233     }
1234    
1235 root 1.7 1;
1236    
1237 elmex 1.1 =back
1238    
1239 root 1.38 =head1 SECURITY CONSIDERATIONS
1240    
1241     This module is quite powerful, with with power comes the ability to abuse
1242     as well: If you accept "hostnames" and ports from untrusted sources,
1243     then note that this can be abused to delete files (host=C<unix/>). This
1244     is not really a problem with this module, however, as blindly accepting
1245     any address and protocol and trying to bind a server or connect to it is
1246     harmful in general.
1247    
1248 elmex 1.1 =head1 AUTHOR
1249    
1250 root 1.7 Marc Lehmann <schmorp@schmorp.de>
1251     http://home.schmorp.de/
1252 elmex 1.1
1253     =cut
1254