Как открыть сокет после закрытия? - PullRequest
0 голосов
/ 11 мая 2018

Я пытался открыть сокет

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

, отправив сообщение, а затем закрыв его

sock.close()

, но я не знаю, как открыть его снова.Я использую сокет UDP, и sock.connect () - это команда TCP, я думаю ... по крайней мере, я пытался, но это вызвало ошибку.

1 Ответ

0 голосов
/ 11 мая 2018

Вы не можете снова открыть сокет. Как объясняет close:

Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из makefile () закрыты. Как только это произойдет, все будущие операции с объектом сокета завершатся неудачей.

Это присуще модели сокетов BSD: закрытие сокета означает, что ядро ​​отбрасывает все ресурсы, связанные с этим сокетом, и освобождает дескриптор файла. Как POSIX определяет это:

Если fildes ссылается на сокет, close () вызовет разрушение сокета.

Если вы попытаетесь использовать этот файловый дескриптор снова, вы получите ошибку EBADFD, если вам повезет - и если вам не повезет, вы получите совершенно другой сокет или файл, в котором повторно использовалось то же число. Фактически, это верно для всех файловых дескрипторов, а не только для сокетов. Снова цитируем POSIX:

После закрытия файла дескриптор файла больше не существует, поскольку соответствующее ему целое число больше не относится к файлу.


Что вы можете сделать, конечно, это создать совершенно новый сокет, так же, как вы создали первый:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

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


Или, конечно, вы просто не можете закрыть розетку. Независимо от причины, по которой вы захотели закрыть сокет, тот факт, что вы хотите использовать его снова, означает, что вы, вероятно, ошиблись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...