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

时间:2010-06-14 16:48:40

标签: perl http

我有一个使用HTTP::Daemon的基本perl HTTP服务器。当我停止并启动脚本时,似乎仍在监听端口,并且我收到一条错误消息,指出我的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);
 }

修改

根据DVK的回复,我尝试调用$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 个答案:

答案 0 :(得分:4)

通过在创建HTTP :: Daemon时设置ReuseAddr => 1,我找到了解决问题的方法。

my $d = new HTTP::Daemon(
    ReuseAddr => 1, 
    LocalAddr => 'localhost', 
    LocalPort => 8000);

答案 1 :(得分:0)

您是否在计划结束时尝试$d->close()

如果没有,请尝试。它没有在HTTP :: Daemon POD示例中记录,但该方法应该可用(继承自IO::Socket

请记住,您可能需要具有创造性的信息,例如在哪里调用它,例如它可能需要进入__DIE__处理程序或END {}阻止