2010-06-14 43 views
2

我有一個使用HTTP::Daemon的基本perl HTTP服務器。當我停止並啓動腳本時,看起來該端口仍在偵聽,並且收到一條錯誤消息,指出我的HTTP :: Daemon實例未定義。如果我在腳本停止後大約一分鐘嘗試啓動腳本,它就可以正常工作,並且可以再次綁定到端口。如何停止在Perl中使用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); 
} 

回答

4

我在創建HTTP :: Daemon時通過設置ReuseAddr => 1找到了解決我的問題的方法。

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

您是否在程序結束時嘗試$d->close()

如果沒有,請嘗試。它在HTTP :: Daemon POD示例中沒有記錄,但該方法應該可用(繼承自IO::Socket

請記住,您可能需要具有創造性才能在何處調用它,例如,它可能需要進入__DIE__處理程序或END {}

+0

是的,我在最後,INT名爲$ D->關閉(),\ __ DIE__和\ __ WARN__塊,我仍然得到同樣的錯誤。 – Trevor 2010-06-14 17:31:05