Python

Python как закрыть упавший сокет?

Сервер открывает сокет и слушает его, потом из-за ошибки закрывается программа, при перезапуске он пишет что адрес уже используется.

p.s. на моменте разработки и тестирования пока не ставлю with и try
Mc.sharipov ******
Mc.sharipov ******
238
Все ресурсы, включая сокеты, должны освобождаться при завершении программы, даже аварийном. Для этого можно использовать менеджер контекста (with..as) или адекватную обработку исключений (try..except..finnaly). Причем при работе с сетью возникновение исключительных ситуаций очень вероятно..

При использовании менеджера контекста гарантируется освобождение ресурса, потому как метод __exit__ вызывается всегда, даже при возникновении исключения. Например:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
__s.bind((HOST, PORT))
__s.listen()
__conn, addr = s.accept()
__with conn:
____print(f"Connected by {addr}")
____while True:
______data = conn.recv(1024)
______if not data: break
______conn.sendall(data)

Менеджеры контекста в данном случае использовать удобней. Тут подробнее:
medium.com/swlh/3-ways-to-create-context-managers-in-python-a88e3ba536f3
docs.python.org/3/library/contextlib.html

При использовании обработки исключений блок finally выполняется в любом случае, потому в нем можно гарантированно закрыть сокет. Например:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
__s.connect((TCP_IP, TCP_PORT))
__s.sendall(MESSAGE)
__data = s.recv(BUFFER_SIZE)
except socket.error:
__print('ERROR!')
finally:
__s.close()

Если у тебя уже повис открытый сокет, можно вручную закрыть через cmd, например:

netstat -ano | findstr :твой_порт
taskkill /pid айди_процесса /F

Дальше сам..
СО
Сергей Одиноков
18 091
Лучший ответ
зависит от того, как выглядит падение
вообще говоря, для перебития TIME_WAIT существует SO_REUSEADDR, но не стоит умышленно использовать её в качестве синей изоленты для говнокода

ошибки нужно по возможности обрабатывать нормально и не падать, так что вот это "на моменте разработки и тестирования пока не ставлю with и try" звучит как какой-то бред
попробуй всё-таки ставить для разнообразия, может, проблема решится сама собой)
Mc.sharipov ****** пока я экспериментирую со схемами и алгоритмами, не ставлю try, чтобы видеть конкретно все ошибки, просто не удобно каждый раз при перезапуске сервера ждать time_wait
Mc.sharipov ****** Когда я делаю except Exception as err: print(err)
он выводит только ошибку, а если без try except то там пишет и в какой строке и все такое
Здравствуй, великий разработчик очень хорошей игры, я думаю вам нужно отключить сокет через настройки или через командые строки
Вадим Павлов
Вадим Павлов
2 294