1. ホーム
  2. python

[解決済み] socket.error: [Errno 10013] アクセス権限で禁止されている方法で、ソケットにアクセスしようとしました。

2022-03-01 02:54:13

質問

Windows 7でPython 2.6.5を使ってカスタムTCPスタックを作成し、ポート80の有効なhttpページ要求をローカルに提供しようとしています。 しかし、Windows 7のセキュリティが強化されたようで、問題が発生しました。 このコードはVistaで動作していました。

以下は私のサンプルコードです。

import SocketServer
import struct

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        headerText = """HTTP/1.0 200 OK
                        Date: Fri, 31 Dec 1999 23:59:59 GMT
                        Content-Type: text/html
                        Content-Length: 1354"""
        bodyText = "<html><body>some page</body></html>"
        self.request.send(headerText + "\n" + bodyText)

if __name__ == "__main__":
    HOST, PORT = "localhost", 80
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

C:\python>python TestServer.py トレースバック(最も最近の呼び出し)。
ファイル "TestServer.py", ライン 19, in server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) ファイル "C:\Python26﹑SocketServer.py", 行 400, in イニット self.server_bind() File "C:\Python26╱SocketServer.py", 行 411, in server_bind self.socket.bind(self.server_address)を実行します。 ファイル "", 行 1, in bind

socket.error: [Errno 10013] ある試みが ソケットにアクセスしようとしました。 アクセス権限で禁止されている

Windows 7でこれを動作させるには、具体的にどうすればよいのでしょうか?

[2010/5/5 @ 2344 PDTに編集] これは 答え の説明では、1024以下のポートにアクセスする場合、昇格/スーパーユーザー権限が必要なため、エラーが発生するとのことです。 より高いポート番号を使用して、それがうまくいくかどうか試してみるつもりです。 しかし、なぜ私のローカル管理者アカウントはポート80にアクセスできないのか、その理由が知りたいのです。

解決方法は?

Windows Vista/7では、UACを使用すると、管理者アカウントは、デフォルトで非特権モードでプログラムを実行します。

プログラムは、管理者として実行する前に、おなじみのUACダイアログで管理者権限を求めるプロンプトを表示する必要があります。Python スクリプトは直接実行できないので、コンテキストメニューに "Run as Administrator" というオプションはありません。

を使用することが可能です。 ctypes.windll.shell32.IsUserAnAdmin() は、スクリプトが管理者アクセス権を持っているかどうかを検出するため、そして ShellExecuteEx python.exe の 'runas' 動詞で、sys.argv[0] をパラメータにして、必要なら UAC ダイアログを表示させます。