+ -
当前位置:首页 → 问答吧 → 问题:POE模块的使用

问题:POE模块的使用

时间:2010-09-02

来源:互联网

  1. se strict;
  2. use Net::Ftp;
  3. use Socket;
  4. use Sys::Hostname;
  5. use POE;
  6. $|++;
  7. my $host = $ARGV[0]||get_ip();
  8. my $user = $ARGV[1]||'ftpadmin';
  9. my $pwd = $ARGV[2]||'adminftp1';
  10. create POE::Session(
  11.         inline_states =>
  12.                 {_start => \&start,
  13.                         _stop => sub{print "exit\n";exit(0);},
  14.                         watcher => \&ftp_watch,
  15.                 },
  16.         );
  17. POE::Kernel->run;

  18. sub start
  19. {
  20.         $_[KERNEL]->yield('watcher',$host,$user,$pwd);
  21.         $_[HEAP]->{max_try} = 10;
  22.         $_[HEAP]->{try_time} =0;
  23. }

  24. sub ftp_watch
  25. {
  26.         print "ok\n";
  27.         my ($kernel,$heap,$host,$user,$pwd) = @_[KERNEL,HEAP,ARG0..ARG2];
  28.         my $ftp=Net::FTP->new($host,Debug=>0,Timeout=>120,Passive => 0);
  29.         if (!$ftp)
  30.         {
  31. #                restart();
  32.                 print "restart\n";
  33.                 print $heap->{try_time},"\t",$heap->{max_try},"\n";
  34.                 if (++$heap->{try_time} > $heap->{max_try})
  35.                 {
  36.                         print 'restart ftp-server faild,i will exit after 5sec',"\n";
  37.                         $kernel->yield('_stop');
  38.                 }
  39.                 $kernel->yield("watcher",$host,$user,$pwd);
  40.         }
  41.         $ftp->quit();
  42.         $heap->{try_time} = 0;
  43.         print "\rftp server is normal";
  44. #        $kernel->delay_set("watcher",1,$host,$user,$pwd);
  45. #        $kernel->yield('watcher');
  46. }
  47. sub get_ip
  48. {
  49. my $host = hostname();
  50. my $name = (gethostbyname($host))[0];
  51. return inet_ntoa(scalar(gethostbyname($name || 'localhost')));
  52. }
复制代码
问题:程序是当连接不上ftp的时候就做其他的事情,当我关闭ftp服务的时候,运行程序,但是只输出了2次的ok,就是说,watcher这个事件只运行了两次,并没有尝试10次的连接···然后就执行stop事件,打印exit了····本人万分不懂···谢谢解答

作者: wfnh   发布时间: 2010-09-02

问题已经解决了,但是我还是不懂,可能和整个的框架有关··一定要事件才行·····可惜·没什么中文的资料··杯具啊····
下面我是改写的代码,仅供解决办法···代码粗糙~~见谅见谅~~

ps:觉得用poe写的东西···很清晰···只要写callback就行了····易读性很强(我的可能不怎么样),非常好的东西···POE··
  1. use strict;
  2. use Net::Ftp;
  3. use Socket;
  4. use Sys::Hostname;
  5. use POE;
  6. $|++;
  7. my $host = $ARGV[0]||get_ip();
  8. my $user = $ARGV[1]||'ftpadmin';
  9. my $pwd = $ARGV[2]||'adminftp1';
  10. create POE::Session(
  11.         inline_states =>
  12.                 {_start => \&start,
  13.                         _stop => sub{print "exit\n";},
  14.                         watcher => \&ftp_watch,
  15.                         restart => \&restart,
  16.                         success => \&disconnect
  17.                 },
  18.         );
  19. POE::Kernel->run;
  20. exit(0);
  21. sub start
  22. {
  23.         $_[KERNEL]->yield('watcher',$host,$user,$pwd);
  24.         $_[HEAP]->{max_try} = 10;
  25.         $_[HEAP]->{try_time} =0;
  26.         print <<READ
  27. 说明:本程序将监控FTP服务,当FTP服务不能提供正常工作时,程序将尝试重启FTP服务
  28.        
  29. READ
  30. }

  31. sub ftp_watch
  32. {
  33.         my ($kernel,$heap,$host,$user,$pwd) = @_[KERNEL,HEAP,ARG0..ARG2];
  34.         my $ftp=Net::FTP->new($host,Debug=>0,Timeout=>120,Passive => 0);
  35.         $ftp ? $kernel->yield('success',$ftp) : $kernel->yield('restart');
  36. }
  37. sub get_ip
  38. {
  39. my $host = hostname();
  40. my $name = (gethostbyname($host))[0];
  41. return inet_ntoa(scalar(gethostbyname($name || 'localhost')));
  42. }

  43. sub restart
  44. {
  45. #        `net stop Serv-U`;
  46. #        sleep 1;
  47. #        my $return = `net start Serv-U`;
  48. #        print "state:\n$return\n";
  49.         print "restart\n";
  50.         ++$_[HEAP]->{try_time} > $_[HEAP]->{max_try} ? $_[KERNEL]->call('_stop') : $_[KERNEL]->delay_set("watcher",1,$host,$user,$pwd);
  51.         print $_[HEAP]->{try_time},"\t",$_[HEAP]->{max_try},"\n";
  52.        
  53. }

  54. sub disconnect
  55. {
  56.         $_[ARG0]->quit();
  57.         $_[HEAP]->{try_time} = 0;
  58.         print "\rftp server is normal";
  59.         $_[KERNEL]->delay_set("watcher",1,$host,$user,$pwd);
  60. }
  61.        
  62.                        
  63.                
复制代码

作者: wfnh   发布时间: 2010-09-02