ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.157
Committed: Wed Oct 31 15:42:06 2012 UTC (11 years, 8 months ago) by root
Branch: MAIN
Changes since 1.156: +0 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.7 =head1 NAME
2 elmex 1.1
3 root 1.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 root 1.153 This function tries to do this job in a better way, it supports (at
241     least) the following formats, where C<port> can be a numerical port
242     number of a service name, or a C<name=port> string, and the C< port> and
243     C<:port> parts are optional. Also, everywhere where an IP address is
244     supported 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.153 # parse host, special cases: "ipv6" or "ipv6[#p ]port"
289 root 1.54 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 root 1.154 if (/\G (?:\s+|:|\#) ([^:[:space:]]+) \s*$/xgc) {
306 root 1.54 $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 root 1.155 $res[$ipv4] = [map { parse_ipv4 $_ } @_];
497 root 1.117 $cv->end;
498     });
499     };
500    
501     if ($ipv6) {
502     $cv->begin;
503     AnyEvent::DNS::aaaa ($name, sub {
504 root 1.155 $res[$ipv6] = [map { parse_ipv6 $_ } @_];
505 root 1.117 $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.147 our %HOSTS; # $HOSTS{$nodename}[$ipv6] = [@aliases...]
650     our @HOSTS_CHECKING; # callbacks to call when hosts have been loaded
651     our $HOSTS_MTIME;
652 root 1.136
653 root 1.147 sub _parse_hosts($) {
654     %HOSTS = ();
655 root 1.136
656 root 1.147 for (split /\n/, $_[0]) {
657 root 1.136 s/#.*$//;
658     s/^[ \t]+//;
659 root 1.137 y/A-Z/a-z/;
660 root 1.136
661     my ($addr, @aliases) = split /[ \t]+/;
662     next unless @aliases;
663    
664     if (my $ip = parse_ipv4 $addr) {
665     push @{ $HOSTS{$_}[0] }, $ip
666     for @aliases;
667     } elsif (my $ip = parse_ipv6 $addr) {
668     push @{ $HOSTS{$_}[1] }, $ip
669     for @aliases;
670     }
671     }
672 root 1.147 }
673    
674     # helper function - unless dns delivered results, check and parse hosts, then clal continuation code
675     sub _load_hosts_unless(&$@) {
676     my ($cont, $cv, @dns) = @_;
677    
678     if (@dns) {
679     $cv->end;
680     } else {
681     my $etc_hosts = length $ENV{PERL_ANYEVENT_HOSTS} ? $ENV{PERL_ANYEVENT_HOSTS}
682     : AnyEvent::WIN32 ? "$ENV{SystemRoot}/system32/drivers/etc/hosts"
683     : "/etc/hosts";
684    
685     push @HOSTS_CHECKING, sub {
686     $cont->();
687     $cv->end;
688     };
689 root 1.136
690 root 1.148 unless ($#HOSTS_CHECKING) {
691 root 1.147 # we are not the first, so we actually have to do the work
692     require AnyEvent::IO;
693    
694 root 1.150 AnyEvent::IO::aio_stat ($etc_hosts, sub {
695 root 1.147 if ((stat _)[9] ne $HOSTS_MTIME) {
696     AE::log 8 => "(re)loading $etc_hosts.";
697     $HOSTS_MTIME = (stat _)[9];
698     # we might load a newer version of hosts,but that's a harmless race,
699     # as the next call will just load it again.
700 root 1.150 AnyEvent::IO::aio_load ($etc_hosts, sub {
701 root 1.147 _parse_hosts $_[0];
702     (shift @HOSTS_CHECKING)->() while @HOSTS_CHECKING;
703     });
704     } else {
705     (shift @HOSTS_CHECKING)->() while @HOSTS_CHECKING;
706     }
707     });
708     }
709     }
710 root 1.136 }
711    
712 root 1.34 sub resolve_sockaddr($$$$$$) {
713     my ($node, $service, $proto, $family, $type, $cb) = @_;
714    
715     if ($node eq "unix/") {
716 root 1.67 return $cb->() if $family || $service !~ /^\//; # no can do
717 root 1.34
718 root 1.67 return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]);
719 root 1.34 }
720    
721     unless (AF_INET6) {
722     $family != 6
723     or return $cb->();
724    
725     $family = 4;
726     }
727    
728     $cb->() if $family == 4 && !$AnyEvent::PROTOCOL{ipv4};
729     $cb->() if $family == 6 && !$AnyEvent::PROTOCOL{ipv6};
730    
731     $family ||= 4 unless $AnyEvent::PROTOCOL{ipv6};
732     $family ||= 6 unless $AnyEvent::PROTOCOL{ipv4};
733    
734     $proto ||= "tcp";
735     $type ||= $proto eq "udp" ? SOCK_DGRAM : SOCK_STREAM;
736    
737 root 1.124 my $proton = AnyEvent::Socket::getprotobyname $proto
738 root 1.34 or Carp::croak "$proto: protocol unknown";
739    
740     my $port;
741    
742     if ($service =~ /^(\S+)=(\d+)$/) {
743     ($service, $port) = ($1, $2);
744     } elsif ($service =~ /^\d+$/) {
745     ($service, $port) = (undef, $service);
746     } else {
747     $port = (getservbyname $service, $proto)[2]
748 root 1.35 or Carp::croak "$service/$proto: service unknown";
749 root 1.34 }
750    
751     # resolve a records / provide sockaddr structures
752     my $resolve = sub {
753 root 1.118 my @target = @_;
754    
755 root 1.34 my @res;
756 root 1.107 my $cv = AE::cv {
757 root 1.34 $cb->(
758     map $_->[2],
759     sort {
760     $AnyEvent::PROTOCOL{$b->[1]} <=> $AnyEvent::PROTOCOL{$a->[1]}
761     or $a->[0] <=> $b->[0]
762     }
763     @res
764     )
765 root 1.107 };
766 root 1.34
767     $cv->begin;
768     for my $idx (0 .. $#target) {
769     my ($node, $port) = @{ $target[$idx] };
770    
771     if (my $noden = parse_address $node) {
772 root 1.40 my $af = address_family $noden;
773    
774     if ($af == AF_INET && $family != 6) {
775 root 1.34 push @res, [$idx, "ipv4", [AF_INET, $type, $proton,
776     pack_sockaddr $port, $noden]]
777     }
778    
779 root 1.40 if ($af == AF_INET6 && $family != 4) {
780 root 1.34 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton,
781     pack_sockaddr $port, $noden]]
782     }
783 root 1.137 } else {
784     $node =~ y/A-Z/a-z/;
785    
786     my $hosts = $HOSTS{$node};
787 root 1.136
788 root 1.137 # a records
789 root 1.34 if ($family != 6) {
790     $cv->begin;
791 root 1.39 AnyEvent::DNS::a $node, sub {
792 root 1.136 push @res, [$idx, "ipv4", [AF_INET , $type, $proton, pack_sockaddr $port, parse_ipv4 $_]]
793 root 1.34 for @_;
794 root 1.137
795     # dns takes precedence over hosts
796 root 1.147 _load_hosts_unless {
797     push @res,
798     map [$idx, "ipv4", [AF_INET , $type, $proton, pack_sockaddr $port, $_]],
799     @{ $HOSTS{$node}[0] };
800     } $cv, @_;
801 root 1.34 };
802     }
803    
804 root 1.137 # aaaa records
805 root 1.34 if ($family != 4) {
806     $cv->begin;
807 root 1.39 AnyEvent::DNS::aaaa $node, sub {
808 root 1.136 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, parse_ipv6 $_]]
809 root 1.34 for @_;
810 root 1.137
811 root 1.147 _load_hosts_unless {
812     push @res,
813     map [$idx + 0.5, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, $_]],
814     @{ $HOSTS{$node}[1] }
815     } $cv, @_;
816 root 1.34 };
817     }
818     }
819     }
820     $cv->end;
821     };
822    
823 root 1.118 $node = AnyEvent::Util::idn_to_ascii $node
824     if $node =~ /[^\x00-\x7f]/;
825    
826 root 1.34 # try srv records, if applicable
827     if ($node eq "localhost") {
828 root 1.118 $resolve->(["127.0.0.1", $port], ["::1", $port]);
829 root 1.34 } elsif (defined $service && !parse_address $node) {
830 root 1.39 AnyEvent::DNS::srv $service, $proto, $node, sub {
831 root 1.34 my (@srv) = @_;
832    
833 root 1.118 if (@srv) {
834     # the only srv record has "." ("" here) => abort
835     $srv[0][2] ne "" || $#srv
836     or return $cb->();
837    
838     # use srv records then
839     $resolve->(
840     map ["$_->[3].", $_->[2]],
841     grep $_->[3] ne ".",
842     @srv
843     );
844     } else {
845     # no srv records, continue traditionally
846     $resolve->([$node, $port]);
847     }
848 root 1.34 };
849     } else {
850 root 1.118 # most common case
851     $resolve->([$node, $port]);
852 root 1.34 }
853     }
854    
855 root 1.15 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
856 elmex 1.1
857 root 1.118 This is a convenience function that creates a TCP socket and makes a
858     100% non-blocking connect to the given C<$host> (which can be a DNS/IDN
859     hostname or a textual IP address, or the string C<unix/> for UNIX domain
860     sockets) and C<$service> (which can be a numeric port number or a service
861     name, or a C<servicename=portnumber> string, or the pathname to a UNIX
862     domain socket).
863 root 1.7
864 root 1.8 If both C<$host> and C<$port> are names, then this function will use SRV
865 root 1.15 records to locate the real target(s).
866 root 1.8
867 root 1.15 In either case, it will create a list of target hosts (e.g. for multihomed
868 root 1.17 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
869 root 1.15 each in turn.
870 root 1.7
871 root 1.108 After the connection is established, then the C<$connect_cb> will be
872 root 1.128 invoked with the socket file handle (in non-blocking mode) as first, and
873 root 1.108 the peer host (as a textual IP address) and peer port as second and third
874     arguments, respectively. The fourth argument is a code reference that you
875     can call if, for some reason, you don't like this connection, which will
876     cause C<tcp_connect> to try the next one (or call your callback without
877     any arguments if there are no more connections). In most cases, you can
878     simply ignore this argument.
879 root 1.15
880     $cb->($filehandle, $host, $port, $retry)
881 root 1.7
882     If the connect is unsuccessful, then the C<$connect_cb> will be invoked
883     without any arguments and C<$!> will be set appropriately (with C<ENXIO>
884 root 1.17 indicating a DNS resolution failure).
885 root 1.7
886 root 1.108 The callback will I<never> be invoked before C<tcp_connect> returns, even
887     if C<tcp_connect> was able to connect immediately (e.g. on unix domain
888     sockets).
889    
890 root 1.17 The file handle is perfect for being plugged into L<AnyEvent::Handle>, but
891     can be used as a normal perl file handle as well.
892 root 1.7
893 root 1.15 Unless called in void context, C<tcp_connect> returns a guard object that
894 root 1.122 will automatically cancel the connection attempt when it gets destroyed
895     - in which case the callback will not be invoked. Destroying it does not
896     do anything to the socket after the connect was successful - you cannot
897     "uncall" a callback that has been invoked already.
898 root 1.15
899 root 1.7 Sometimes you need to "prepare" the socket before connecting, for example,
900     to C<bind> it to some port, or you want a specific connect timeout that
901     is lower than your kernel's default timeout. In this case you can specify
902     a second callback, C<$prepare_cb>. It will be called with the file handle
903     in not-yet-connected state as only argument and must return the connection
904     timeout value (or C<0>, C<undef> or the empty list to indicate the default
905     timeout is to be used).
906    
907 root 1.17 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
908 root 1.7 socket (although only IPv4 is currently supported by this module).
909    
910 root 1.28 Note to the poor Microsoft Windows users: Windows (of course) doesn't
911     correctly signal connection errors, so unless your event library works
912     around this, failed connections will simply hang. The only event libraries
913     that handle this condition correctly are L<EV> and L<Glib>. Additionally,
914     AnyEvent works around this bug with L<Event> and in its pure-perl
915     backend. All other libraries cannot correctly handle this condition. To
916     lessen the impact of this windows bug, a default timeout of 30 seconds
917     will be imposed on windows. Cygwin is not affected.
918 root 1.27
919 root 1.7 Simple Example: connect to localhost on port 22.
920    
921 root 1.45 tcp_connect localhost => 22, sub {
922     my $fh = shift
923     or die "unable to connect: $!";
924     # do something
925     };
926 root 1.7
927     Complex Example: connect to www.google.com on port 80 and make a simple
928     GET request without much error handling. Also limit the connection timeout
929     to 15 seconds.
930    
931     tcp_connect "www.google.com", "http",
932     sub {
933     my ($fh) = @_
934     or die "unable to connect: $!";
935    
936     my $handle; # avoid direct assignment so on_eof has it in scope.
937     $handle = new AnyEvent::Handle
938     fh => $fh,
939 root 1.90 on_error => sub {
940 root 1.144 AE::log error => $_[2];
941 root 1.91 $_[0]->destroy;
942 root 1.90 },
943 root 1.7 on_eof => sub {
944 root 1.90 $handle->destroy; # destroy handle
945 root 1.146 AE::log info => "Done.";
946 root 1.7 };
947    
948     $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
949    
950 elmex 1.111 $handle->push_read (line => "\015\012\015\012", sub {
951 root 1.7 my ($handle, $line) = @_;
952    
953     # print response header
954     print "HEADER\n$line\n\nBODY\n";
955    
956     $handle->on_read (sub {
957     # print response body
958     print $_[0]->rbuf;
959     $_[0]->rbuf = "";
960     });
961     });
962     }, sub {
963     my ($fh) = @_;
964     # could call $fh->bind etc. here
965 elmex 1.2
966 root 1.7 15
967     };
968 elmex 1.2
969 root 1.34 Example: connect to a UNIX domain socket.
970    
971     tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
972     ...
973     }
974    
975 root 1.7 =cut
976 elmex 1.2
977 root 1.7 sub tcp_connect($$$;$) {
978     my ($host, $port, $connect, $prepare) = @_;
979 elmex 1.2
980 root 1.118 # see http://cr.yp.to/docs/connect.html for some tricky aspects
981 root 1.33 # also http://advogato.org/article/672.html
982 elmex 1.2
983 root 1.7 my %state = ( fh => undef );
984 elmex 1.2
985 root 1.33 # name/service to type/sockaddr resolution
986 root 1.67 resolve_sockaddr $host, $port, 0, 0, undef, sub {
987 root 1.15 my @target = @_;
988 root 1.7
989 root 1.15 $state{next} = sub {
990     return unless exists $state{fh};
991 root 1.7
992 root 1.142 my $errno = $!;
993 root 1.15 my $target = shift @target
994 root 1.132 or return AE::postpone {
995 root 1.123 return unless exists $state{fh};
996     %state = ();
997 root 1.142 $! = $errno;
998 root 1.123 $connect->();
999     };
1000 root 1.7
1001 root 1.15 my ($domain, $type, $proto, $sockaddr) = @$target;
1002 root 1.7
1003 root 1.15 # socket creation
1004     socket $state{fh}, $domain, $type, $proto
1005     or return $state{next}();
1006    
1007     fh_nonblocking $state{fh}, 1;
1008    
1009 root 1.27 my $timeout = $prepare && $prepare->($state{fh});
1010    
1011 root 1.30 $timeout ||= 30 if AnyEvent::WIN32;
1012 root 1.15
1013 root 1.107 $state{to} = AE::timer $timeout, 0, sub {
1014 root 1.90 $! = Errno::ETIMEDOUT;
1015 root 1.27 $state{next}();
1016 root 1.107 } if $timeout;
1017 root 1.7
1018 root 1.156 # now connect
1019 root 1.107 if (
1020     (connect $state{fh}, $sockaddr)
1021     || ($! == Errno::EINPROGRESS # POSIX
1022     || $! == Errno::EWOULDBLOCK
1023     # WSAEINPROGRESS intentionally not checked - it means something else entirely
1024     || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt
1025     || $! == AnyEvent::Util::WSAEWOULDBLOCK)
1026     ) {
1027     $state{ww} = AE::io $state{fh}, 1, sub {
1028     # we are connected, or maybe there was an error
1029     if (my $sin = getpeername $state{fh}) {
1030     my ($port, $host) = unpack_sockaddr $sin;
1031    
1032     delete $state{ww}; delete $state{to};
1033    
1034     my $guard = guard { %state = () };
1035    
1036     $connect->(delete $state{fh}, format_address $host, $port, sub {
1037     $guard->cancel;
1038     $state{next}();
1039     });
1040     } else {
1041 root 1.119 if ($! == Errno::ENOTCONN) {
1042     # dummy read to fetch real error code if !cygwin
1043     sysread $state{fh}, my $buf, 1;
1044    
1045     # cygwin 1.5 continously reports "ready' but never delivers
1046     # an error with getpeername or sysread.
1047     # cygwin 1.7 only reports readyness *once*, but is otherwise
1048 root 1.130 # the same, which is actually more broken.
1049 root 1.119 # Work around both by using unportable SO_ERROR for cygwin.
1050     $! = (unpack "l", getsockopt $state{fh}, Socket::SOL_SOCKET(), Socket::SO_ERROR()) || Errno::EAGAIN
1051     if AnyEvent::CYGWIN && $! == Errno::EAGAIN;
1052     }
1053 root 1.15
1054 root 1.107 return if $! == Errno::EAGAIN; # skip spurious wake-ups
1055 root 1.89
1056 root 1.107 delete $state{ww}; delete $state{to};
1057 root 1.15
1058     $state{next}();
1059 root 1.107 }
1060     };
1061 root 1.7 } else {
1062 root 1.29 $state{next}();
1063 root 1.7 }
1064     };
1065 elmex 1.1
1066 root 1.90 $! = Errno::ENXIO;
1067 root 1.15 $state{next}();
1068 root 1.7 };
1069 elmex 1.1
1070 root 1.15 defined wantarray && guard { %state = () }
1071 elmex 1.1 }
1072    
1073 root 1.35 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
1074 elmex 1.1
1075 root 1.140 Create and bind a stream socket to the given host address and port, set
1076     the SO_REUSEADDR flag (if applicable) and call C<listen>. Unlike the name
1077 root 1.35 implies, this function can also bind on UNIX domain sockets.
1078    
1079     For internet sockets, C<$host> must be an IPv4 or IPv6 address (or
1080 root 1.38 C<undef>, in which case it binds either to C<0> or to C<::>, depending
1081     on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in
1082     future versions, as applicable).
1083 root 1.21
1084     To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
1085     wildcard address, use C<::>.
1086    
1087 root 1.140 The port is specified by C<$service>, which must be either a service name
1088     or a numeric port number (or C<0> or C<undef>, in which case an ephemeral
1089 root 1.21 port will be used).
1090    
1091 root 1.35 For UNIX domain sockets, C<$host> must be C<unix/> and C<$service> must be
1092     the absolute pathname of the socket. This function will try to C<unlink>
1093 root 1.133 the socket before it tries to bind to it, and will try to unlink it after
1094     it stops using it. See SECURITY CONSIDERATIONS, below.
1095 root 1.35
1096 root 1.21 For each new connection that could be C<accept>ed, call the C<<
1097     $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking
1098 root 1.128 mode) as first, and the peer host and port as second and third arguments
1099 root 1.21 (see C<tcp_connect> for details).
1100    
1101     Croaks on any errors it can detect before the listen.
1102 elmex 1.1
1103 root 1.7 If called in non-void context, then this function returns a guard object
1104 root 1.17 whose lifetime it tied to the TCP server: If the object gets destroyed,
1105 root 1.7 the server will be stopped (but existing accepted connections will
1106 root 1.129 not be affected).
1107 elmex 1.1
1108 root 1.143 Regardless, when the function returns to the caller, the socket is bound
1109     and in listening state.
1110    
1111 root 1.7 If you need more control over the listening socket, you can provide a
1112 root 1.21 C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the
1113     C<listen ()> call, with the listen file handle as first argument, and IP
1114     address and port number of the local socket endpoint as second and third
1115     arguments.
1116 elmex 1.2
1117 root 1.7 It should return the length of the listen queue (or C<0> for the default).
1118 elmex 1.2
1119 root 1.38 Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on
1120     C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack
1121     hosts. Unfortunately, only GNU/Linux seems to implement this properly, so
1122     if you want both IPv4 and IPv6 listening sockets you should create the
1123     IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore
1124     any C<EADDRINUSE> errors.
1125    
1126 root 1.24 Example: bind on some TCP port on the local machine and tell each client
1127 root 1.7 to go away.
1128 elmex 1.2
1129 root 1.24 tcp_server undef, undef, sub {
1130 root 1.7 my ($fh, $host, $port) = @_;
1131 elmex 1.1
1132 root 1.7 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
1133 root 1.24 }, sub {
1134     my ($fh, $thishost, $thisport) = @_;
1135 root 1.146 AE::log info => "Bound to $thishost, port $thisport.";
1136 root 1.7 };
1137 elmex 1.1
1138 root 1.67 Example: bind a server on a unix domain socket.
1139    
1140     tcp_server "unix/", "/tmp/mydir/mysocket", sub {
1141     my ($fh) = @_;
1142     };
1143    
1144 root 1.7 =cut
1145 elmex 1.1
1146 root 1.7 sub tcp_server($$$;$) {
1147 root 1.35 my ($host, $service, $accept, $prepare) = @_;
1148 elmex 1.1
1149 root 1.25 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1150 root 1.22 ? "::" : "0"
1151 root 1.21 unless defined $host;
1152    
1153 root 1.34 my $ipn = parse_address $host
1154     or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1155 root 1.21
1156 root 1.35 my $af = address_family $ipn;
1157 root 1.21
1158 root 1.7 my %state;
1159 elmex 1.1
1160 root 1.36 # win32 perl is too stupid to get this right :/
1161     Carp::croak "tcp_server/socket: address family not supported"
1162     if AnyEvent::WIN32 && $af == AF_UNIX;
1163    
1164 root 1.35 socket $state{fh}, $af, SOCK_STREAM, 0
1165 root 1.36 or Carp::croak "tcp_server/socket: $!";
1166 elmex 1.1
1167 root 1.35 if ($af == AF_INET || $af == AF_INET6) {
1168     setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1169 root 1.36 or Carp::croak "tcp_server/so_reuseaddr: $!"
1170 root 1.37 unless AnyEvent::WIN32; # work around windows bug
1171 root 1.35
1172     unless ($service =~ /^\d*$/) {
1173     $service = (getservbyname $service, "tcp")[2]
1174     or Carp::croak "$service: service unknown"
1175     }
1176     } elsif ($af == AF_UNIX) {
1177     unlink $service;
1178     }
1179 elmex 1.1
1180 root 1.35 bind $state{fh}, pack_sockaddr $service, $ipn
1181 root 1.7 or Carp::croak "bind: $!";
1182 elmex 1.1
1183 root 1.133 if ($af == AF_UNIX) {
1184     my $fh = $state{fh};
1185     my $ino = (stat $fh)[1];
1186     $state{unlink} = guard {
1187     # this is racy, but is not designed to be foolproof, just best-effort
1188     unlink $service
1189     if $ino == (stat $fh)[1];
1190     };
1191     }
1192    
1193 root 1.7 fh_nonblocking $state{fh}, 1;
1194 elmex 1.1
1195 root 1.21 my $len;
1196    
1197     if ($prepare) {
1198 root 1.35 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1199     $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1200 root 1.21 }
1201    
1202     $len ||= 128;
1203 elmex 1.1
1204 root 1.7 listen $state{fh}, $len
1205     or Carp::croak "listen: $!";
1206 elmex 1.1
1207 root 1.107 $state{aw} = AE::io $state{fh}, 0, sub {
1208 root 1.7 # this closure keeps $state alive
1209 root 1.115 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1210 root 1.7 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1211 root 1.37
1212 root 1.35 my ($service, $host) = unpack_sockaddr $peer;
1213     $accept->($fh, format_address $host, $service);
1214 root 1.7 }
1215 root 1.107 };
1216 elmex 1.1
1217 root 1.7 defined wantarray
1218     ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1219     : ()
1220 elmex 1.1 }
1221    
1222 root 1.125 =item tcp_nodelay $fh, $enable
1223    
1224     Enables (or disables) the C<TCP_NODELAY> socket option (also known as
1225     Nagle's algorithm). Returns false on error, true otherwise.
1226    
1227     =cut
1228    
1229     sub tcp_nodelay($$) {
1230     my $onoff = int ! ! $_[1];
1231    
1232     setsockopt $_[0], Socket::IPPROTO_TCP (), Socket::TCP_NODELAY (), $onoff
1233     }
1234    
1235     =item tcp_congestion $fh, $algorithm
1236    
1237 root 1.126 Sets the tcp congestion avoidance algorithm (via the C<TCP_CONGESTION>
1238     socket option). The default is OS-specific, but is usually
1239     C<reno>. Typical other available choices include C<cubic>, C<lp>, C<bic>,
1240     C<highspeed>, C<htcp>, C<hybla>, C<illinois>, C<scalable>, C<vegas>,
1241     C<veno>, C<westwood> and C<yeah>.
1242 root 1.125
1243     =cut
1244    
1245     sub tcp_congestion($$) {
1246 root 1.127 defined TCP_CONGESTION
1247     ? setsockopt $_[0], Socket::IPPROTO_TCP (), TCP_CONGESTION, "$_[1]"
1248 root 1.125 : undef
1249     }
1250    
1251 elmex 1.1 =back
1252    
1253 root 1.38 =head1 SECURITY CONSIDERATIONS
1254    
1255     This module is quite powerful, with with power comes the ability to abuse
1256     as well: If you accept "hostnames" and ports from untrusted sources,
1257     then note that this can be abused to delete files (host=C<unix/>). This
1258     is not really a problem with this module, however, as blindly accepting
1259     any address and protocol and trying to bind a server or connect to it is
1260     harmful in general.
1261    
1262 elmex 1.1 =head1 AUTHOR
1263    
1264 root 1.7 Marc Lehmann <schmorp@schmorp.de>
1265 root 1.152 http://anyevent.schmorp.de
1266 elmex 1.1
1267     =cut
1268    
1269 root 1.145 1
1270