TIME_WAIT状態にあるコネクションをなんとかして使う

ネットワークプログラムをデバッグのために、何度も繰り返し実行していると、同一のポート番号がすぐには使えなくなり、しばらく待たなければプログラムの実行ができないことが頻繁にある。これは、そのポートによるコネクションがTIME_WAIT状態にあるためで、これがCLOSE状態になるまである程度の時間待たなければならない。
実行するごとに異なるポート番号を使えば、この待ち時間をなくせるのだが、それは面倒だという場合には、socketオブジェクトのメソッドsetsockoptを使う(ソケットのオプションを設定するメソッド)。bindする前に実行する。
株式会社アクセンス・テクノロジー ネットワーク更新pingを送信する のように。

import socket
...
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
soc.bind((host, port))
...

また、SocketServerを使ってサーバプログラムを書く場合に同じことをやろうとするとhttp://nullege.com/codes/search/SocketServer.ThreadingTCPServer.socket.setsockoptから推測して以下のようにする。

import SocketServer
import socket       #これを追加!
...
server = SocketServer.TCPServer((host, port), MyTCPHandler)
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   #これを追加!
server.serve_forever()

これでいいはずだが、場合によってはやっぱりbindエラーになるときがあるな。無茶な終了のさせ方にも限度があるのかな。