2009-03-03 3 views
6

私は最近Pythonを学んでいましたが、私はちょうどPythonのsocketライブラリを使ってネットワーキングを始めました。私のスクリプトが接続を終了せずに終了した最近まで、すべてがうまくいっています。私は、スクリプトを実行した次の時間は、私が得た: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') 

だから、何かがまだPythonスクリプトが実行されていない(と私は$px auxを使用して、これを確認したにも関わらず、ポートにバインドされているようです何の。奇妙なことに、1分後に同じポートでスクリプトを再実行することができます。これが将来発生するときのポートを防止/解除する方法はありますか?

答えて

14

欲しいもの行う場合は、bindの直前です。

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

あなたが動作している理由は、最後の接続が終了してからしばらくの間、OSが特定のポートを予約しているためです。これは、アプリケーションが終了した後に入ってくる可能性がある追加のパケットを適切に破棄できるようにするためです。

SO_REUSEADDRソケットオプションを設定することで、あなたは何をやっている知っているとあなたはまだ同じポートにバインドしたいOSを語っています。

+1

また、ソケットでshutdown()とclose()を呼び出すこともできます。 –