代码之家  ›  专栏  ›  技术社区  ›  Trevor

如何在Perl中停止侦听HTTP::Daemon端口

  •  2
  • Trevor  · 技术社区  · 14 年前

    HTTP::Daemon . 当我停止并启动脚本时,似乎仍在监听端口,并收到一条错误消息,指出我的HTTP::Daemon实例未定义。如果我尝试在脚本停止一分钟后启动它,它工作正常,可以再次绑定到端口。

     use HTTP::Daemon;
     use HTTP::Status;
    
     my $d = new HTTP::Daemon(LocalAddr => 'localhost', LocalPort => 8000);
    
     while (my $c = $d->accept) {
        while (my $r = $c->get_request) {
           $c->send_error(RC_FORBIDDEN)
        }
        $c->close;
        undef($c);
     }
    

    编辑:

    $d->close() 但在尝试重新启动脚本时仍会出现相同的错误。

    END { $d->close(); }
    $SIG{'INT'} = 'CLEANUP';
    $SIG{__WARN__} = 'CLEANUP';
    $SIG{__DIE__} = 'CLEANUP';
    
    sub CLEANUP {
        $d->close();
        undef($d);
        print "\n\nCaught Interrupt (^C), Aborting\n";
        exit(1);
    }
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Trevor    14 年前

    我通过设置 ReuseAddr => 1 创建HTTP::Daemon时。

    my $d = new HTTP::Daemon(
        ReuseAddr => 1, 
        LocalAddr => 'localhost', 
        LocalPort => 8000);
    
        2
  •  0
  •   DVK    14 年前

    $d->close() 在节目结束时?

    如果没有,试试看。它没有在HTTP::Daemon POD示例中记录,但是该方法应该是可用的(从 IO::Socket

    记住,你可能需要有创造性地去称呼它,例如,它可能需要进入 __DIE__ 处理程序或 END {}