J'essaie de créer une pile TCP personnalisée à l'aide de Python 2.6.5 sous Windows 7 pour traiter localement les demandes de page http valides sur le port 80. Mais, j'ai rencontré un problème avec ce qui semble être une sécurité renforcée pour Windows 7. Ce code a fonctionné sur Vista.
Voici mon exemple de code:
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 __== "__main__":
Host, PORT = "localhost", 80
server = SocketServer.TCPServer((Host, PORT), MyTCPHandler)
server.serve_forever()
C:\python> python TestServer.py Traceback (appel le plus récent en dernier):
Fichier "TestServer.py", ligne 19, dans server = SocketServer.TCPServer ((Host, PORT), MyTCPHandler) Fichier "C:\Python26\lib\SocketServer.py", ligne 400, dans init self.server_bind () Fichier "C:\Python26\lib\SocketServer.py", ligne 411, dans server_bind self.socket.bind (self.server_address) Fichier "", ligne 1, dans bindsocket.error: [Errno 10013] Une tentative a été fait pour accéder à une prise de manière interdit par ses permissions d'accès
Comment puis-je obtenir que cela fonctionne sur Windows 7?
[Edit on 5/5/2010 @ 2344 PDT] Cette answer explique que l'erreur est due à la nécessité de disposer de privilèges élevés/de super-utilisateurs pour accéder aux ports inférieurs à 1024. Je vais essayer d'utiliser un numéro de port supérieur pour voir si ça marche. Cependant, je voudrais toujours savoir pourquoi mon compte d’administrateur local ne peut pas accéder au port 80.
Sous Windows Vista/7, avec le contrôle de compte d'utilisateur, les comptes d'administrateur exécutent les programmes en mode sans privilège par défaut.
Les programmes doivent demander un accès administrateur avant de s'exécuter en tant qu'administrateur, à l'aide de la boîte de dialogue UAC si familière. Les scripts Python n'étant pas directement exécutables, il n'y a pas d'option de menu contextuel "Exécuter en tant qu'administrateur".
Il est possible d'utiliser ctypes.windll.Shell32.IsUserAnAdmin()
pour détecter si le script a un accès administrateur et ShellExecuteEx
avec le verbe 'runas' sur python.exe, avec sys.argv [0] en tant que paramètre permettant d'inviter le dialogue UAC si nécessaire.
Je viens de rencontrer le même problème, mon système est Win7. utilisez simplement la commande sur le terminal comme: netstat -na | findstr port, vous verrez que le port a été utilisé. Ainsi, si vous souhaitez démarrer le serveur sans ce message, vous pouvez modifier un autre port non utilisé.
McAfee le bloquait pour moi. Je devais autoriser le programme dans les règles de protection d'accès
Voir http://www.symantec.com/connect/articles/we-are-unable-send-your-email-caused-McAfee
Pour moi, il se plaignait comme ça sous Windows 7 x64 quand un autre processus écoutait déjà sur ce même port.
Il est possible de voir les ports actuellement occupés (liés) en exécutant
netstat -ban
socket.error: [Errno 10013] Une tentative d'accès à une socket de manière interdite par ses autorisations d'accès
Vous avez ceci avec flask :
Cela signifie que le port auquel vous essayez de vous connecter, est déjà utilisé par un autre service ou processus :
if __== "__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)
Je devais autoriser ..\python27\python.exe dans le pare-feu Windows. Je n'ai pas besoin de faire cela sur WinXP ou Win8.
Il suffit d’exécuter sur des ports supérieurs à 1024, tout ce qui se trouve en dessous est privilégié, c’est le même accord que sous Linux, j’utilise 5000 par exemple sur les gains sans aucune escalade de privilège UAC.
Il semble que le port 80 soit déjà utilisé. Essayez d’utiliser un autre port qui n’est utilisé par aucune autre application de votre système.