Как правильно закрыть сокет в Python 2.6? - PullRequest
3 голосов
/ 04 мая 2010

у меня простой сервер / клиент. и я использую netcat в качестве клиента для тестирования сервера. если я остановлю сервер перед выходом клиента, я не смогу запустить сервер снова некоторое время, и я уйду с этой ошибкой: " [Errno 98] Адрес уже используется «

но если я сначала закрою клиент, то сервер остановится, у меня не возникнет этой проблемы.

мой сокет сервера работает так:

try:
  s=socket
  s.bind(..)
  s.listen(1)
  conn,addr=s.accept()
finally:
  conn.close()
  s.close()

мне кажется, что сервер неправильно закрыл сокет. но я не знаю, как это исправить.

1 Ответ

9 голосов
/ 04 мая 2010

Ты прекрасно закрываешь сокет. Однако сокет продолжает использовать ресурсы в течение нескольких минут после закрытия сокета, поэтому, если удаленный конец пропустил пакет, пакет может быть повторно отправлен.

Вы должны обойти эту проблему, позвонив по следующему номеру, прежде чем позвонить bind:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Это сообщит операционной системе, что вы хотите разрешить множественные привязки сокета.

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