Подтвердить что ты не робот

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

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

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

Изменение порта устраняет проблему.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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