1

Python 2 および 3kwsgi.simple_server.make_server(host, port, app)では、ポートが既に使用されている場合、 usingは例外を発生させません。代わりに、.server_forever()またはへの呼び出し.handle_request()は、他のポートが閉じて次の接続が着信するまで単にブロックします。

import wsgiref.simple_server as simple_server

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return ["<html><body><p>Hello!</p></body></html>".encode('utf-8')]

def main():
    server = simple_server.make_server('', 8901, application)
    server.serve_forever()

if __name__ == "__main__":
    main()

socket.socket.bind()この場合も例外が発生するため、例外が発生することが予想されます。返さHTTPServerれたポートが指定されたポートに正常にバインドされたかどうかを判断する方法はありますか?

4

1 に答える 1

1

この理由がわかりました。Python 2.7.8のHTTPServerクラス ソース コードは次のとおりです。

class HTTPServer(SocketServer.TCPServer):

    allow_reuse_address = 1    # Seems to make sense in testing environment

    def server_bind(self):
        """Override server_bind to store the server name."""
        import pdb; pdb.set_trace()
        SocketServer.TCPServer.server_bind(self)
        host, port = self.socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)
        self.server_port = port

そして、次のようallow_reuse_addressに使用されます。SocketServer.TCPServer.server_bind()

class TCPServer(BaseServer):

    # ...

    def server_bind(self):
        """Called by constructor to bind the socket.

        May be overridden.

        """
        if self.allow_reuse_address:
            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(self.server_address)
        self.server_address = self.socket.getsockname()

に設定allow_reuse_addressすると、例外Falseが発生します。コメントには「テスト環境では意味がある」と書かれているので、クラスself.socket.bind(self.server_address)のこの行は意図的なものなのだろうか。HTTPServer

于 2014-08-09T16:46:55.070 に答える