Windows 7でTCP 2.6.5を使用してカスタムPythonスタックを作成し、ポート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、サーバー= SocketServer.TCPServer((Host、PORT)、MyTCPHandler)ファイル「C:\ Python26\lib\SocketServer.py」、行400、initself.server_bind()ファイル "C:\ Python26\lib\SocketServer.py"、server_bindの411行self.socket.bind(self.server_address )ファイル「」、1行目、バインドsocket.error:[Errno 10013]アクセス許可で禁止されている方法でソケットにアクセスしようとしました
Windows 7でこれを正確に機能させるにはどうすればよいですか?
[2010年5月5日@ 2344 PDTの編集]この answer は、1024よりも低いポートにアクセスする際に、昇格/スーパーユーザー権限が必要なためにエラーが発生することを説明しています。より高いポート番号を使用して、それが機能するかどうかを確認します。ただし、ローカル管理者アカウントがポート80にアクセスできない理由を知りたいです。
UACを使用するWindows Vista/7では、管理者アカウントはデフォルトで非特権モードでプログラムを実行します。
プログラムは、管理者として実行する前に、これまでにない使い慣れたUACダイアログで管理者アクセスを要求する必要があります。 Pythonスクリプトは直接実行できないため、[管理者として実行]コンテキストメニューオプションはありません。
ctypes.windll.Shell32.IsUserAnAdmin()
を使用して、スクリプトに管理者アクセス権があるかどうかを検出できます。また、sys.argv [0で、python.exeの 'runas'動詞で ShellExecuteEx
を使用できます]必要に応じてUACダイアログを表示するパラメーターとして。
同じ問題が発生したばかりで、私のシステムはWin7です。 netstat -na | findstr portのような端末でコマンドを使用するだけで、ポートが使用されていることがわかります。したがって、このメッセージなしでサーバーを起動する場合は、使用されていない他のポートを変更できます。
マカフィーは私のためにそれをブロックしていました。アクセス保護ルールでプログラムを許可する必要がありました
http://www.symantec.com/connect/articles/we-are-unable-send-your-email-caused-McAfee を参照してください
私にとっては、同じポートで別のプロセスが既にリッスンしているときに、Windows 7 x64でそのように不平を言っていました。
実行することにより、現在占有されている(バインドされた)ポートを確認することができます。
netstat -ban
socket.error:[Errno 10013]アクセス許可で禁止されている方法でソケットにアクセスしようとしました
flaskでこれを得ました:
バインドしようとしているポート既に別のサービスまたはプロセスで使用されている:Eclipse/windowsで開発された私のコードでこれに関するヒントを得ました:
if __name__ == "__main__":
# Check the System Type before to decide to bind
# If the system is a Linux machine -:)
if platform.system() == "Linux":
app.run(Host='0.0.0.0',port=5000, debug=True)
# If the system is a windows /!\ Change /!\ the /!\ Port
Elif platform.system() == "Windows":
app.run(Host='0.0.0.0',port=50000, debug=True)
別のポートでサーバーを実行してみてください。私のために働いた:
python manage.py runserver 127.0.0.1:7000
説明:
Django documentation:
このスクリプトを通常の特権を持つユーザーとして実行する場合(推奨)、低いポート番号でポートを開始するアクセス権がない可能性があります。低いポート番号はスーパーユーザー(root)用に予約されています。
このサーバーは、WSGI_APPLICATION設定で指定されたWSGIアプリケーションオブジェクトを使用します。
本番環境でこのサーバーを使用しないでください。セキュリティ監査やパフォーマンステストは行っていません。 (そして、それは今後も続くでしょう。私たちは、WebサーバーではなくWebフレームワークを作成するビジネスをしているので、実稼働環境を処理できるようにこのサーバーを改善することはDjangoの範囲外です。)
Windowsファイアウォールで..\python27\python.exeを許可する必要がありました。 WinXPやWin8でこれを行う必要はありません。
1024を超えるポートで実行するだけで、以下は特権があります。Linuxと同じことです。たとえば、UAC特権エスカレーションのない勝利で5000を使用します。
主な問題は、別のアプリケーションで使用されているポート番号です。そのため、以下に示すようにポート番号を未使用のものに変更できます。
Windowsでは、Windowsタスクマネージャーのさまざまなアプリで使用されている使用ポート番号を表示できます。
python manage.py runserver 127.0.0.1:portnumber
Ex: python manage.py runserver 127.0.0.1:8080
ポート80はすでに使用されているようです。システム内の他のアプリケーションで使用されていない他のポートを使用してみてください。