Не удается привязать адрес после сбоев программы сокета
Если моя программа выйдет из строя до закрытия сокета, то при следующем запуске я получаю сообщение об ошибке, которое выглядит следующим образом:
socket.error: [Errno 48] Address already in use
Изменение порта устраняет проблему.
Есть ли способ избежать этого, и почему это происходит (когда программа выходит, не следует ли сборку мусора собирать и закрывать)?
Ответы
Ответ 1
Используйте .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
в вашем гнезде для прослушивания.
Поиск этих терминов даст вам много объяснений, почему это необходимо. В принципе, после того, как ваша первая программа закроется, ОС держит предыдущий слуховой сокет в состоянии выключения для TIME_WAIT
времени. SO_REUSEADDR
говорит, что вы хотите использовать тот же прослушивающий порт независимо.
Ответ 2
Большинство ОС занимают до 2 минут, чтобы закрыть сокет, когда программа не закроет его в первую очередь. Я много раз сталкивался с программами на C, которые SEGFAULT (и у меня их нет) или аналогичными.
Изменить:
Благодаря ephemient для указания RFC 793 (TCP), который определяет это тайм-аут.
Ответ 3
Другие люди, которые получают эту ошибку, могут получить ее, потому что порт используется другим процессом. Поэтому проверьте, используется ли какой-либо порт другими процессами, и запустите вашу программу в другом порту или убейте блокирующие процессы.