Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

anyevent + fork = problem

by hithim (Initiate)
on Dec 07, 2012 at 14:08 UTC ( #1007745=perlquestion: print w/ replies, xml ) Need Help??
hithim has asked for the wisdom of the Perl Monks concerning the following question:

Hi dear monks , i try to make some kind of dhcp server with anyevent , here my test code :
#!/usr/bin/perl use Data::Dumper; use strict; use warnings; use EV; use Fcntl; use IO::Socket; use AnyEvent; $| = 1; $0 = 'DHCP manager'; my $pid; my %pids; my @pids; our %binds; my $serv; my $serv_ip = '10.10.10.10'; socket($serv, PF_INET, SOCK_DGRAM, getprotobyname('udp')); fcntl($serv, F_SETFL, O_NONBLOCK); setsockopt($serv, SOL_SOCKET, SO_REUSEADDR, 1); my $new_child = sub { ### create socket for ipc my $child; my $parent; socketpair($child, $parent, AF_UNIX, SOCK_DGRAM, PF_UNSPEC); fcntl($child, F_SETFL, O_NONBLOCK); fcntl($parent, F_SETFL, O_NONBLOCK); $child->autoflush(1); $parent->autoflush(1); if (!defined($pid = fork())) {# print Dumper 'Cannot fork anymore'; die "cannot fork: $!"; } elsif ($pid) { # parent $pids{$pid}{'sock'} = $parent; $pids{$pid}{'on_finish'} = AnyEvent->child (pid => $pid, cb => + sub { ## when child die - start new one print Dumper 'CHILD Died'; new_child(); }); $pids{$pid}{'ev'} = AnyEvent->io (fh => $parent, poll => 'r', +cb => sub { my $buf; print Dumper $binds{'0019c632c637'}{'1'}{'001c238b8b02'}; }); push @pids , $pid; close $child; print Dumper "parent fork $pid"; } else { #child close $parent; undef %binds; $0 = 'DHCP worker'; $| = 1; my $fh = $child; my $w = AnyEvent->io (fh => $fh, poll => 'r', cb => sub { my $buf; recv($fh, $buf, 500, 0); send ($fh , $buf, 0); }); EV::loop(); die; } }; foreach (1..2){ &$new_child(); } bind ($serv, sockaddr_in('67', inet_aton($serv_ip))); listen($serv, SOMAXCONN); my $server_hdl = AnyEvent->io (fh => $serv, poll => 'r', cb => sub { my $buf; my $fromaddr = recv($serv, $buf, 500, 0) or print Dumper $!; return if ($!); return if (length($buf) < 236); my $hdl = shift @pids; my ($port, $addr) = unpack_sockaddr_in($fromaddr); $addr = inet_ntoa($addr); print Dumper "$$ Master get pocket from $addr"; send ($pids{$hdl}{'sock'} , $addr.' '.$buf , 0); push @pids , $hdl; }); print "Master listening\n"; $binds{'0019c632c637'}{'1'}{'001c238b8b02'}{'ip'} = '10.12.16.7'; $binds{'0019c632c637'}{'1'}{'001c238b8b02'}{'router'} = '10.12.16.1'; $binds{'0019c632c637'}{'1'}{'001c238b8b02'}{'mask'} = '255.255.255.0'; EV::loop();
when i test this code - some times i get undef value on "print Dumper $binds{'0019c632c637'}{'1'}{'001c238b8b02'};" , can anyone help me ? ps: when i create keys in hash %binds before fork - all is perfect

Comment on anyevent + fork = problem
Download Code
Re: anyevent + fork = problem
by roboticus (Canon) on Dec 07, 2012 at 15:08 UTC

    hithim:

    I don't understand why you're using fork. Since there's no a whole lot of logic to DHCP, it's not like you have large tasks you need to fork off to keep your server available. Don't you just need to hit a hash and send a reply? That should be quick enough to just handle as it comes without splitting off another process.

    Similarly, if you *want* to use fork, then I don't understand why you want to use AnyEvent.

    I've not used AnyEvent before, so there might simply be something I don't understand, though.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re: anyevent + fork = problem
by hithim (Initiate) on Dec 07, 2012 at 15:14 UTC
    serializ/deserialize packet is take some time and for highload server i need to use all cores of processor so i decide to use fork.

      hithim:

      Really? How long is it taking to serialize and deserialize? I wouldn't expect it to take enough time to worry about.

      ...roboticus

      When your only tool is a hammer, all problems look like your thumb.

Re: anyevent + fork = problem
by blue_cowdawg (Monsignor) on Dec 07, 2012 at 15:21 UTC
        , i try to make some kind of dhcp server with anyevent ,

    Why? There are decent DHCP servers already out there for just about every flavor/variety of OS ever written... I'd be willing to bet there's even one for Android! Reinventing the wheel....


    Peter L. Berghold -- Unix Professional
    Peter -at- Berghold -dot- Net; AOL IM redcowdawg Yahoo IM: blue_cowdawg
Re: anyevent + fork = problem
by hithim (Initiate) on Dec 07, 2012 at 22:26 UTC
    guys , i really appreciate your comments , but i need solve exactly this issue.
      :) Kinda the purpose behind AnyEvent is so you don't fork :) You could use Proc::Background, stat a file in your anyevent stuff, stat a file, when file changes, get data from file
Re: anyevent + fork = problem
by ftumsh (Scribe) on Dec 19, 2012 at 13:38 UTC
    Have a look at fork_call in AnyEvent::Util, it may help

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1007745]
Approved by ww
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (9)
As of 2014-12-20 04:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (95 votes), past polls