Python Binding Socket: «Адрес уже используется», после закрытия сокета - PullRequest
0 голосов
/ 19 июня 2019

Я знаю, что уже есть подобный вопрос, но ни одно из решений не решает мою проблему.Более ssh я запускаю скрипт на удаленном клиенте с

nohup python script.py &

Этот скрипт содержит следующее:

TCP_PORT = 5005
host = ""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.settimeout(40)
s.bind((host, TCP_PORT))
s.listen(0)
c, addr = s.accept()

...some code...

try:
    while True:
        c.send(str(1).ljust(16).encode())
except Exception as e:
    print("exiting main")
    print(e)
    c.close()
    s.close()

Когда я запускаю код два раза подряд в строке, второй разЯ всегда получаю вышеупомянутую ошибку.Журнал вывода Python:

exiting main
[Errno 32] Broken pipe

Traceback (most recent call last):
  File "LogImages.py", line 204, in <module>
    main(interv)
  File "LogImages.py", line 114, in main
    s.bind((host, TCP_PORT))
OSError: [Errno 98] Address already in use

Итак, очевидно, что процесс вызывает c.close () и s.close ().Так как же адрес все еще может использоваться?

1 Ответ

1 голос
/ 19 июня 2019

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

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

...