Вы не можете снова открыть сокет. Как объясняет close
:
Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из makefile () закрыты. Как только это произойдет, все будущие операции с объектом сокета завершатся неудачей.
Это присуще модели сокетов BSD: закрытие сокета означает, что ядро отбрасывает все ресурсы, связанные с этим сокетом, и освобождает дескриптор файла. Как POSIX определяет это:
Если fildes ссылается на сокет, close () вызовет разрушение сокета.
Если вы попытаетесь использовать этот файловый дескриптор снова, вы получите ошибку EBADFD
, если вам повезет - и если вам не повезет, вы получите совершенно другой сокет или файл, в котором повторно использовалось то же число. Фактически, это верно для всех файловых дескрипторов, а не только для сокетов. Снова цитируем POSIX:
После закрытия файла дескриптор файла больше не существует, поскольку соответствующее ему целое число больше не относится к файлу.
Что вы можете сделать, конечно, это создать совершенно новый сокет, так же, как вы создали первый:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Возможно, вы получите другой дескриптор файла, но для большинства кодов сокетов это не будет иметь значения.
Или, конечно, вы просто не можете закрыть розетку. Независимо от причины, по которой вы захотели закрыть сокет, тот факт, что вы хотите использовать его снова, означает, что вы, вероятно, ошиблись.