SocketServerのエラー「socket.error: (98, 'Address already in use')」
pythonのSocketServerモジュールを使っていて、前回bindしたソケットは閉じているのに再実行時に以下のようにsocket.errorが発生した。
$ python -V Python 2.4.3 $ python test_srv.py server start server close $ python test_srv.py Traceback (most recent call last): File "test_srv.py", line 48, in ? server = SocketServer.ThreadingTCPServer(('0.0.0.0', 12345), MyHandler) File "/usr/lib/python2.4/SocketServer.py", line 330, in __init__ self.server_bind() File "/usr/lib/python2.4/SocketServer.py", line 341, in server_bind self.socket.bind(self.server_address) File "<string>", line 1, in bind socket.error: (98, 'Address already in use')
これを回避するには、クラス変数allow_reuse_addressをTrueにするといいみたい。
※server_bind()の中で、socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)が実行されるようになる。
import SocketServer class MyHandler(SocketServer.StreamRequestHandler): def handle(self): '''リクエストを受けたときに実行する処理 ''' pass if __name__ == '__main__': SocketServer.ThreadingTCPServer.allow_reuse_address = True server = SocketServer.ThreadingTCPServer(('0.0.0.0', 12345), MyHandler) try: print "server start" server.serve_forever() except KeyboardInterrupt, err: # Ctrl-Cで終了 print "server close" server.server_close()
参考
Python ライブラリリファレンス SocketServer
サーバアプリケーションの作成 (TCP/SOCK_STREAM)