it-swarm.com.de

socket.error: [Errno 10013] Es wurde versucht, auf einen Socket auf eine Weise zuzugreifen, die durch seine Zugriffsberechtigungen verboten ist

Ich versuche, einen benutzerdefinierten TCP -Stack mit Python 2.6.5 unter Windows 7 zu erstellen, um gültige HTTP-Seitenanforderungen an Port 80 lokal bereitzustellen. Ich bin jedoch mit einem Problem konfrontiert, bei dem es scheint, als würde Windows 7 die Sicherheit verschärfen. Dieser Code funktionierte unter Vista.

Hier ist mein Beispielcode:

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 (letzter Anruf zuletzt):
Datei "TestServer.py", Zeile 19, in server = SocketServer.TCPServer ((Host, PORT), MyTCPHandler) Datei "C:\Python26\lib\SocketServer.py", Zeile 400 in init self.server_bind () Datei "C:\Python26\lib\SocketServer.py", Zeile 411 in server_bind self.socket.bind (self.server_address) Datei "", Zeile 1, in Bind

socket.error: [Errno 10013] Ein Versuch wurde so gemacht, um auf einen Socket in einer Weise zuzugreifen verboten durch seine Zugriffsberechtigungen

Wie bekomme ich das genau unter Windows 7?

[Bearbeiten am 05.05.2010 @ 2344 PDT] Diese Antwort erklärt, dass der Fehler durch die Notwendigkeit erhöhter/Superuser-Berechtigungen beim Zugriff auf Ports unter 1024 verursacht wird. Ich versuche, eine höhere Portnummer zu verwenden um zu sehen, ob das funktioniert. Ich möchte jedoch immer noch wissen, warum mein lokales Administratorkonto nicht auf Port 80 zugreifen kann. 

23
bitcycle

Unter Windows Vista/7 führen Administratorkonten mit UAC standardmäßig Programme im unprivilegierten Modus aus.

Programme müssen zur Eingabe des Administratorzugriffs auffordern, bevor sie als Administrator ausgeführt werden, mit dem vertrauten UAC-Dialogfeld. Da Python-Skripts nicht direkt ausführbar sind, gibt es keine Kontextmenüoption "Als Administrator ausführen".

Mit ctypes.windll.Shell32.IsUserAnAdmin() können Sie feststellen, ob das Skript über Administratorzugriff verfügt, und ShellExecuteEx mit dem Verb 'runas' auf python.exe und mit sys.argv [0] als Parameter, um bei Bedarf den UAC-Dialog aufzurufen.

18
lunixbochs

Ich bin gerade auf das gleiche Problem gestoßen, mein System ist Win7. Verwenden Sie einfach den Befehl auf dem Terminal: netstat -na | findstr port. Sie sehen, dass der Port verwendet wurde. Wenn Sie den Server also ohne diese Meldung starten möchten, können Sie einen anderen Port ändern, der nicht verwendet wurde.

27
David

McAfee blockierte es für mich. Ich musste das Programm in den Zugriffsschutzregeln zulassen

  1. Öffnen Sie VirusScan
  2. Klicken Sie mit der rechten Maustaste auf Zugriffsschutz, und wählen Sie Eigenschaften
  3. Klicken Sie auf "Virenschutz-Standardschutz".
  4. Wählen Sie die Regel "Verhindern Sie das Versenden von Mailing-Würmern" und klicken Sie auf Bearbeiten
  5. Fügen Sie die Anwendung der Ausschlussliste hinzu und klicken Sie auf OK

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

11
frmdstryr

Für mich war dies unter Windows 7 x64 so zu beanstanden, als ich bereits einen anderen Prozess an demselben Port abhörte.

Es ist möglich, aktuell belegte (gebundene) Ports durch Ausführen anzuzeigen

netstat -ban
8
kuz8

socket.error: [Errno 10013] Es wurde versucht, auf einen Socket zuzugreifen, der durch seine Zugriffsberechtigungen verboten ist.

Habe das mit flask

Bedeutet, dass der Port, an den Sie sich zu binden versuchen, bereits von einem anderen Dienst oder Prozess: Verwendet wird, einen Hinweis darauf in meinem auf Eclipse/windows entwickelten Code hat:

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

Versuchen Sie, den Server an einem anderen Port auszuführen. Arbeitete für mich:

python manage.py runserver 127.0.0.1:7000

Erläuterung:

wie in Django Dokumentation erwähnt:

Wenn Sie dieses Skript als Benutzer mit normalen Berechtigungen ausführen (empfohlen), haben Sie möglicherweise keinen Zugriff, um einen Port mit einer niedrigen Portnummer zu starten. Niedrige Portnummern sind für den Superuser (root) reserviert.

Dieser Server verwendet das in der Einstellung WSGI_APPLICATION angegebene WSGI-Anwendungsobjekt.

VERWENDEN SIE DIESEN SERVER NICHT IN EINER PRODUKTIONSEINSTELLUNG. Es wurden keine Sicherheitsüberprüfungen oder Leistungstests durchgeführt. (Und so wird es auch bleiben. Wir sind bestrebt, Web-Frameworks und keine Webserver zu erstellen. Daher liegt die Verbesserung dieses Servers für die Verwaltung einer Produktionsumgebung außerhalb des Anwendungsbereichs von Django.)

3

Ich musste ..\python27\python.exe in der Windows-Firewall zulassen. Ich muss das nicht auf WinXP oder Win8 tun.

2
Brent Smith

Nur über Ports oberhalb von 1024 laufen, alles unterhalb ist privilegiert, es ist derselbe Deal mit Linux. Ich verwende 5000 zum Beispiel für Wins ohne UAC-Privaterhöhung. 

1
Pythonista

Das Hauptproblem ist die von einer anderen Anwendung verwendete Portnummer. Sie können die Portnummer wie unten gezeigt in eine nicht verwendete ändern.

In Windows können Sie die verwendeten Portnummern anzeigen, die von verschiedenen Apps im Windows-Task-Manager verwendet werden.

python manage.py runserver 127.0.0.1:portnumber
Ex: python manage.py runserver 127.0.0.1:8080
0
Thusitha Deepal

Es scheint, dass der Port 80 bereits verwendet wird. Versuchen Sie, einen anderen Port zu verwenden, der von keiner anderen Anwendung in Ihrem System verwendet wird. 

0