Закрыть серверный сокет при выходе / сбое - PullRequest
5 голосов
/ 14 октября 2011

Я учусь использовать сокеты в python, и довольно часто, когда моя программа падает, или когда я нажимаю Ctrl + C, сокет сервера как-то продолжает слушать порт.Это, очевидно, мешает программе прослушивать этот порт при повторном запуске, поэтому я должен продолжать изменять его.

Я предполагаю, что мне нужно где-то делать socket.close (), но где?

Ответы [ 2 ]

8 голосов
/ 14 октября 2011

Вы можете попробовать модуль atexit .

import atexit

function close_socket:
    s.close()

atexit.register(close_socket)

Если проблема заключается в задержке порта, который становится доступным во время тестирования, я бы предложил установить SO_REUSEADDR, что позволит портубыть связанным немедленно снова вместо ожидания тайм-аутов в стеке TCP.

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1 голос
/ 14 октября 2011

При завершении программы все ее сокеты автоматически закрываются.Тем не менее, порты TCP все еще остаются в использовании после этого. FAQ по сокету для UNIX содержит очень длинное объяснение в разделе 2.7.

. В целях тестирования лучше всего запросить произвольный порт (или запросить последовательные, например, 8000, 8001)., 8002, ...) и выведите этот порт в консоль.

...