Невозможно выполнить привязку к адресу после сбоя программы сокета

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

socket.error: [Errno 48] Address already in use

Смена порта устраняет проблему.

Есть ли способ избежать этого, и почему это происходит (при выходе из программы, не должен ли сокет собираться и закрываться)?

3 ответа

Решение

Использование .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) на вашем сокете прослушивания.

Поиск этих терминов даст вам много объяснений, почему это необходимо. По сути, после того, как ваша первая программа закрывается, ОС сохраняет предыдущий прослушивающий сокет в выключенном состоянии для TIME_WAIT время. SO_REUSEADDR говорит, что вы хотите использовать один и тот же порт прослушивания независимо.

Большинству ОС требуется до 2 минут, чтобы закрыть сокет, если программа не закрыла его должным образом. Я много раз сталкивался с программами на Си, которые SEGFAULT (и не обрабатываются) или аналогичными.

Редактировать:
Спасибо ephemient за указание RFC 793 (TCP), который определяет это время ожидания.

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

Другие вопросы по тегам