Как избежать прослушивания сокета в Perl после сбоя скрипта? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть скрипт, который использует IO :: Socket :: INET для установки TCP-сервера

my $socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '10010',
Proto => 'tcp',
Listen => 5,
);

Если мой скрипт вылетает или останавливается пользователем до того, как он достигнет закрытия сокета сервера,затем в следующий раз при запуске скрипта он не сможет привязаться к порту, так как все еще есть процесс, прослушивающий порт to

За исключением результатов netstat -anobp tcp

TCP    0.0.0.0:10010          0.0.0.0:0              LISTENING       22628
[System]

Да, яЯ использую Windows.

Запрос на уничтожение задачи:

taskkill /f /PID 22628

завершается неудачно с:

ERROR: The process "22628" not found.

Единственный способ обойти это - перезагрузиться или увеличитьпорт прослушивания.Поскольку я не являюсь настоящим разработчиком программного обеспечения и могу в первый раз написать отличный код, который не дает сбоя, я часто сталкиваюсь с этой проблемой.

Также стоит отметить, что это происходит только после подключения клиента ксервер.

Есть ли способ предотвратить это (без прослушивания сирот) или способ избавиться от сироты?

1 Ответ

0 голосов
/ 13 февраля 2019

Устранена ли проблема при добавлении следующего?

В большинстве систем решение будет таким:

my $socket = new IO::Socket::INET (
    ...
    ReuseAddr => 1,
    ReusePort => 1,
    ...
);

В системах, в которых нет SO_REUSEPORT, например в Windows,решение будет:

my $socket = new IO::Socket::INET (
    ...
    ReuseAddr => 1,
    ...
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...