【问题标题】:How to stop listening on an HTTP::Daemon port in Perl如何在 Perl 中停止监听 HTTP::Daemon 端口
【发布时间】:2010-06-14 16:48:40
【问题描述】:

我有一个使用 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);
}

【问题讨论】:

    标签: perl http


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      请记住,您可能需要对在哪里调用它有创意,例如它可能需要进入__DIE__ 处理程序或END {}

      【讨论】:

      • 是的,我在 END、INT、_DIE_ 和 _WARN_ 块中调用了 $d->close(),但我仍在获取同样的错误。
      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多