Python [Errno 98] Адрес уже используется
В моей программе сокетов Python мне иногда нужно прервать его с помощью Ctrl-C. Когда я делаю это, он закрывает соединение, используя socket.close()
,
Тем не менее, когда я пытаюсь открыть его снова, мне нужно подождать примерно минуту, прежде чем я смогу снова подключиться. Как правильно закрыть сокет? Или это предназначено?
17 ответов
Да, это предназначено. Здесь вы можете прочитать подробное объяснение. Это поведение можно переопределить, установив параметр SO_REUSEADDR для сокета. Например:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
$ ps -fA | grep python
501 81211 12368 0 10:11PM ttys000 0:03.12
python -m SimpleHTTPServer
$ kill 81211
Потому что вы пытаетесь запустить службу в том же порту, который уже работает.
Некоторое время это происходит, потому что ваш сервис не остановлен в стеке процессов. ты должен их убить
Вот команда из одной строки, чтобы убить все запущенные процессы Python.
для ОС на базе Linux:
kill -9 (ps -A | grep python | awk '{print $1}')
Если вы используете 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)
Простое решение, которое сработало для меня, это закрыть Терминал и перезапустить его.
У меня ничего не получалось, кроме запуска подпроцесса с этой командой перед вызовом HTTPServer(('', 443), myHandler):
убить -9 $(lsof -ti tcp:443)
Конечно, это только для Linux-подобных ОС!
Для Linux,
ps aux | grep python
Это покажет вам ошибку. Номер процесса (например, 35225), содержащий ваш файл python, является ошибкой.
Теперь,
sudo kill -9 35225
Это убьет процесс ошибки, и ваша проблема будет решена.
Прежде всего найдите идентификатор процесса python с помощью этой команды
ps -fA | grep python
Вы получите номер pid, указав свой процесс python во втором столбце
Затем убейте процесс с помощью этой команды
kill -9 pid
Ничего не делайте, просто подождите пару минут, и проблема решится. Это происходит из-за медленного завершения некоторых процессов, и поэтому он даже не отображается в списке запущенных процессов.
Запустить команду
fuser -k (port_number_you_are _trying_to_access)/TCP
пример для колбы: fuser -k 5000/tcp
Также помните, что эта ошибка возникает, когда вы вставляете ctrl+z. поэтому для завершения используйте ctrl+c
Я столкнулся с аналогичной ошибкой на сервере odoo и решил ее с помощью следующих простых шагов:
Вставьте следующий код в терминал
ps -fA | grep python
Вы получите номер pid. Теперь скопируйте номер pid из второго столбца вывода терминала.
Затем напишите, как показано ниже
kill -9 pid
Терминал перезагрузится, а затем команда
flask run
Будет работать нормально! Спасибо
Я попробовал следующий код, чтобы решить проблему:
sudo lsof -t -i tcp:8000 | xargs kill -9
У меня была такая же проблема (адрес Err98 уже используется) на Raspberry Pi, на котором запущен питон для диспетчера зарядки электромобилей для настенного разъема Tesla. Программное обеспечение раньше работало нормально, но однажды оно перестало опрашивать солнечный инвертор, и я целыми днями думал, что это то, что я сделал на питоне. Оказывается, основная причина заключалась в том, что модем Wi-Fi назначил новый динамический IP-адрес солнечному инвертору в результате внедрения нового смарт-телевизора в мой дом. Я изменил код python, чтобы отразить новый IP-адрес, который я нашел от модема Wi-Fi и бинго, проблема была исправлена.
Получил ту же ошибку:
Выполнены шаги:
1 - используется$ ps -fA | grep python
2 - Убил весь процесс
3 - Терминал закрыт
4 - перезапустил и запустил приложение (mkchromecast).
5 - не получил это сообщение об ошибке.
Есть еще одна проблема. отслеживая это.
Самый чистый способ немедленного повторного использования сокета — следовать рекомендации сначала отключить клиентскую часть (сокет) соединения и убедиться, что конец сервера отключается последним (при необходимости с помощью обработки исключений).
Это вполне может означать, что сервер работает вечно.
Это не проблема, если этот «вечный» цикл приостанавливает выполнение, например, чтение из сокета.
Как вы «разорвете» этот «вечный» цикл, зависит от вас как от администратора сервера, если нет клиентов (кроме очевидных исключений на уровне системы)
Получил эту ошибку после того, как запустил свой код при программировании Pico W через Thonny. В командной строке просто выполните socket.reset(), чтобы устранить проблему.
>>> socket.reset()