http://www.perlmonks.org?node_id=1014918


in reply to Re^2: How to pass AnyEvent socket handle to pre-forked child process?
in thread How to pass AnyEvent socket handle to pre-forked child process?

You can use accept, you just should ensure that it will not block. Make server socket non-blocking, add read watcher to it, in read callback accept all connections. Something like:

use AnyEvent::Util qw(fh_nonblocking); ...; fh_nonblocking $srv_sock, 1; my $w = AE::io $srv_sock, 0, sub { while(accept my $cli_sock, $srv_sock) { # initialize watchers for client socket } };
  • Comment on Re^3: How to pass AnyEvent socket handle to pre-forked child process?
  • Download Code

Replies are listed 'Best First'.
Re^4: How to pass AnyEvent socket handle to pre-forked child process?
by michaelfung (Novice) on Jan 25, 2013 at 07:56 UTC

    Thanks Pavel! Now I know that sockets can be shared between forked childen.

    The following skeleton worked for me:

    # parent domain ... my $server_socket = IO::Socket::INET->new( Listen => 5, ReuseAddr => 1, LocalAddr => 'a.b.c.d', LocalPort => nnnn, Blocking => 0 ) # fork n children ... # child domain: fh_nonblocking $server_socket, 1; my $w = AE::io $server_socket, 0, sub { while(accept my $client_socket, $server_socket) { # setup handlers for this new client: $handles->{$client_id} = new AnyEvent::Handle( fh => $client_socket, on_read => sub { ... }, on_error => sub { ... }, ); $handles->{$client_id}->push_write ("Child $child_no welcome client + $client_id \015\012"); ...