2009-03-03 2 views
6

Я недавно изучал python, и я только начал играть в сети, используя библиотеку socket python. Все прошло хорошо до недавнего времени, когда мой скрипт завершился без закрытия соединения. В следующий раз, когда я запускал скрипт, я получил:Связывание порта Python

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

Таким образом, кажется, что-то еще переплетены к порту, даже если сценарий питона не работает (и я проверил это с помощью $px aux Что. Странно, что через минуту или около того я снова смогу запустить сценарий на том же порту, и все будет хорошо. Есть ли способ предотвратить/развязать порт, когда это произойдет в будущем?

ответ

14

Что вы хотите делать только перед bind, do:

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

Причина, по которой вы видите, что вы находитесь, заключается в том, что ОС резервирует этот конкретный порт в течение некоторого времени после завершения последнего соединения. Это значит, что он может правильно отбросить любые последующие пакеты, которые могут появиться после завершения приложения.

Установив опцию сокета SO_REUSEADDR, вы сообщаете ОС, что знаете, что делаете, и вы все еще хотите привязать к тому же порту.

+1

Также вы можете вызвать shutdown() и закрыть() в сокете. –

Смежные вопросы