我有一个使用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);
}
答案 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 {}
阻止