Как перестать слушать на порту HTTP :: Daemon в Perl - PullRequest
2 голосов
/ 14 июня 2010

У меня есть базовый HTTP-сервер Perl, использующий 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);
 }

РЕДАКТИРОВАТЬ:

Согласно ответу 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 ]

4 голосов
/ 14 июня 2010

Я нашел решение своей проблемы, установив ReuseAddr => 1 при создании HTTP :: Daemon.

my $d = new HTTP::Daemon(
    ReuseAddr => 1, 
    LocalAddr => 'localhost', 
    LocalPort => 8000);
0 голосов
/ 14 июня 2010

Вы пробовали $d->close() в конце программы?

Если нет, попробуйте это.Это не документировано в примере HTTP :: Daemon POD, но метод должен быть доступен (унаследовано от IO :: Socket )

Помните, что вам, возможно, нужно быть изобретательным в отношении того, где его вызывать,например, может потребоваться перейти в обработчик __DIE__ или END {} block

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...