Невозможно выполнить привязку к адресу после сбоя программы сокета - PullRequest
14 голосов
/ 16 февраля 2010

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

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

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

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

Ответы [ 3 ]

23 голосов
/ 16 февраля 2010

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

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

3 голосов
/ 16 февраля 2010

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

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

2 голосов
/ 12 июня 2012

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

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