Python [Errno 98] Адрес уже используется

96

В моей программе сокетов Python мне иногда нужно прервать ее с помощью Ctrl-C. Когда я это делаю, он закрывает соединение с помощью socket.close().

Однако, когда я пытаюсь открыть его снова, мне приходится подождать, кажется, минуту, прежде чем я снова смогу подключиться. Как правильно закрыть розетку? Или это задумано?

Skylerl
источник

Ответы:

120

Да, это задумано. Здесь вы можете прочитать подробное объяснение . Это поведение можно изменить, установив опцию SO_REUSEADDR для сокета. Например:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Бартош
источник
Странный. Я вызвал это прямо перед привязкой, и ошибка все еще возникает. Я, должно быть, ошибаюсь где-то еще.
byxor
Неважно, у меня было странное состояние гонки при многократном связывании и завершении работы отдельных потоков для моих автоматических тестов.
byxor
Вам необходимо импортировать модуль под названием socket.
Бартош,
32
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
айуб лаазиз
источник
2
К сожалению, не всегда получается. Это было моей непосредственной мыслью, когда я столкнулся с этой проблемой, но в моем случае нет процесса python, который нужно убить.
Kryten
22

Если вы используете TCPServer, UDPServer или их подклассы в модуле SocketServer, вы можете установить эту переменную класса (до создания экземпляра сервера):

SocketServer.TCPServer.allow_reuse_address = True

(через SocketServer.ThreadingTCPServer - Невозможно привязать к адресу после перезапуска программы )

Это заставляет init (конструктор):

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
dirkk0
источник
14

потому что вы пытаетесь запустить службу на том же порту, который уже запущен.

некоторое время это происходит, потому что ваша служба не останавливается в стеке процессов. ты должен убить их

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

для ОС на базе Linux:

Баш:

kill -9 $(ps -A | grep python | awk '{print $1}')

Рыба:

kill -9 (ps -A | grep python | awk '{print $1}')
MohitGhodasara
источник
1
Сработало у меня Спасибо!
Код
1
Сработало
7

Для меня сработало простое решение - закрыть Терминал и перезапустить его.

Сиддхартх Сетхия
источник
7

У меня ничего не работало, кроме запуска подпроцесса с этой командой перед вызовом HTTPServer(('', 443), myHandler):

kill -9 $(lsof -ti tcp:443)

Конечно, это только для Linux-подобных ОС!

Мирко
источник
4

Прежде всего найдите идентификатор процесса Python с помощью этой команды

ps -fA | grep python

Вы получите номер pid, указав свой процесс python во втором столбце

Затем убейте процесс с помощью этой команды

kill -9 pid
Абдул Басит
источник
0

Получил ту же ошибку:
Выполнены шаги:
1 - использован $ ps -fA | grep python
2 - завершен весь процесс
3 - закрыт терминал
4 - перезапущен и запущено приложение (mkchromecast).
5 - не получил это сообщение об ошибке.

Есть еще одна проблема. отслеживая это.

silvertech048
источник
0

запустите команду

fuser -k (port_number_you_are _trying_to_access)/TCP

пример для колбы: fuser -k 5000/tcp

Также помните, что эта ошибка возникает, когда вы вставляете ctrl + z. поэтому для завершения используйте ctrl + c

Манодж Кумар М
источник