1

TCP サーバーでソケットを適切に閉じるにはどうすればよいですか?

いくつかの情報をクライアントにエコーバックする単純な TCP サーバーを作成しました。今、私は localhost:8088 でそれを使用killallし、コードの作業中にいつでも使用を停止して再起動したいと思います。

ただし、すべてのソケットを閉じてアドレスを「解放」するのに問題があるため、すぐにいくつかのテストを行い、コード内の何かを修正してから停止 (Ctrl+C) してサーバーを再起動すると、socket.error: [Errno 98] Address already in use.

ときsudo netstat -ntap、まだ127.0.0.1:8088TIME_WAIT 状態のソケットがいくつか見られます。だから私は彼らが「死ぬ」まで待たなければなりません。

私のテストケース:

#!/usr/bin/python
import SocketServer

class MyEchoHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        self.data = self.request.recv(1024).strip()
        # do something smart with the data, but for now, just say hello.
        self.reply = "Content-Type: text/plain\r\n\r\nhello."
        self.request.send(self.reply)
        self.request.close()

def main():
    server = SocketServer.TCPServer((HOST, PORT), MyEchoHandler)
    server.serve_forever()

if __name__ == '__main__':
    HOST, PORT = "localhost", 8088
    main()

私は何を間違っていますか?十分ではありませんself.request.close()か?

Python 2.7.3 の Debian でこれを試していますが、Python 2.6 でも Squeeze をサポートする必要があります。

4

2 に答える 2