web-dev-qa-db-fra.com

socket.error: [Errno 10013] Une tentative d'accès à une socket de manière interdite par ses autorisations d'accès a été effectuée

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 bind

socket.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. 

23
bitcycle

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.

18
lunixbochs

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é.

27
David

McAfee le bloquait pour moi. Je devais autoriser le programme dans les règles de protection d'accès

  1. Ouvrez VirusScan
  2. Cliquez avec le bouton droit sur Protection d'accès et choisissez Propriétés.
  3. Cliquez sur "Protection standard anti-virus"
  4. Sélectionnez la règle "Empêcher l'envoi de courrier aux vers de publipostage en masse", puis cliquez sur Modifier.
  5. Ajoutez l'application à la liste des processus à exclure, puis cliquez sur OK.

Voir http://www.symantec.com/connect/articles/we-are-unable-send-your-email-caused-McAfee

11
frmdstryr

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
8
kuz8

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)
4
A.HEDDAR

Je devais autoriser ..\python27\python.exe dans le pare-feu Windows. Je n'ai pas besoin de faire cela sur WinXP ou Win8.

2
Brent Smith

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. 

1
Pythonista

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. 

0
Sameer Choudhary