2010-05-06 14 views
21

Ich versuche, einen benutzerdefinierten TCP-Stack mit Python 2.6.5 unter Windows 7 zu erstellen, um eine gültige http-Seite zu liefern Anfragen an Port 80 lokal. Aber ich bin in einen Haken geraten mit dem, was wie Windows 7 Sicherheit scheint. Dieser Code funktionierte unter Vista.socket.error: [Errno 10013] Es wurde versucht, auf einen Socket zuzugreifen, der durch seine Zugriffsberechtigungen verboten ist.

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 __name__ == "__main__": 
    HOST, PORT = "localhost", 80 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    server.serve_forever() 

C:\python>python TestServer.py Traceback (most recent call last):
File "TestServer.py", line 19, in server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) File "C:\Python26\lib\SocketServer.py", line 400, in init self.server_bind() File "C:\Python26\lib\SocketServer.py", line 411, in server_bind self.socket.bind(self.server_address) File "", line 1, in bind

socket.error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions

Wie genau kann ich das auf Windows 7 zu arbeiten?

[Bearbeiten am 05.05.2010 @ 2344 PDT] Dieser answer erklärt, dass der Fehler durch die Notwendigkeit für erhöhte/Superuser-Berechtigungen beim Zugriff auf Ports niedriger als 1024 verursacht wird. Ich werde versuchen, eine höhere Portnummer zu verwenden um zu sehen, ob das funktioniert. Ich möchte jedoch immer noch wissen, warum mein lokaler Administrator-Account nicht auf Port 80 zugreifen kann.

+4

Ihrem lokales Admin-Konto kann zu binden, die Lage sein, den Port 80 nicht, weil es bereits ein anderer Prozess ist (Server) gebunden zu ihm. 'telnet 127.0.0.1 80' zeigt Ihnen schnell, ob Port 80 bereits gebunden ist. – msw

+1

@msw Das sollte einen anderen Fehler geben. –

+0

@ msw/everywhere notieren, dass [ein Telnet-Client standardmäßig nicht auf Win7 installiert ist.] (Http://technet.microsoft.com/en-us/library/cc771275%28v=ws.10%29.aspx) – pythonlarry

Antwort

15

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

Programme müssen Administratorzugriff anfordern, bevor sie als Administrator mit dem allseits bekannten UAC-Dialog ausgeführt werden. Da Python-Skripts nicht direkt ausführbar sind, gibt es keine Kontextmenüoption "Als Administrator ausführen".

Es ist möglich, ctypes.windll.shell32.IsUserAnAdmin() zu verwenden, um festzustellen, ob die Skript Admin-Zugriff hat, und ShellExecuteEx mit dem Verb ‚runas‘ auf python.exe, mit sys.argv [0] als Parameter den UAC-Dialog aufzufordern, wenn nötig.

+0

stellen Sie sicher, dass Sie "ctypes importieren" vor dem Ausführen von 'ctypes.windll.shell32.IsUserAnAdmin()' – northben

22

Ich habe gerade das gleiche Problem, mein System ist Win7. benutze einfach den Befehl am Terminal wie: netstat -na | findstr Port, du wirst sehen, dass der Port benutzt wurde. Wenn Sie den Server ohne diese Nachricht starten möchten, können Sie den anderen Port ändern, der nicht verwendet wurde.

+3

Dies war der Fall für mich auf Win8 – Asken

+1

ich konnte auch diesen Fehler beheben, indem Sie den Anwendungsport in Win8 – Neeraj

+0

ändern Oder stoppen/Ändern Sie den Prozess, der den anderen Port verwendet. Viele Möglichkeiten, um den Prozess zu finden: https://stackoverflow.com/questions/48198/how-can-you-find-out-which-process-is-listening-on-a-port-on-windows –

1

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

8

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

  1. öffnen Virusscan
  2. Recht zu ermöglichen, auf Zugriffsschutz klicken und Prevent Masseneigenschaften
  3. Klicken Sie auf „Anti-Virus Standardschutz“
  4. Select-Regel“wählen Mailing-Würmer senden Mail“und klicken Sie auf bearbeiten
  5. Fügen Sie die Anwendung auf die Liste Prozesse auszuschließen, und klicken Sie auf OK

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

+0

Danke Mann gespeichert mein Leben, das ich für die letzten 2 Tage feststeckte, machte viele Änderungen, aber arbeitete von dieser Lösung – OBAID

-3

Ich habe eine Lösung gefunden, um dieses Problem in Python zu lösen.

Gehe zu c: \ python27 \ Verzeichnis und rigtlcick python.exe und Tab zur Kompatibilitäts und wählen Sie die Admin-Berechtigung Option und übernehmen Sie die Änderungen. Jetzt geben Sie den Befehl zum Erstellen der Socket-Verbindung ein.

+5

Das ist unsicher, da es * alle * Python-Skripte mit Administratorrechten ausführt. Darüber hinaus hat die Frage seit mehreren Jahren eine akzeptierte Antwort. –

7

Für mich beschwerte es sich so über Windows 7 x64, als ich einen anderen Prozess hatte, der bereits auf dem gleichen Port zuhörte.

Es ist möglich, derzeit besetzt (gebunden) Ports zu sehen, indem Sie

netstat -ban 
3

socket.error: [Errno 10013] Ein Versuch, eine Buchse in einer Weise, durch seine Zugriffsberechtigungen verboten zuzugreifen gemacht wurde

erhielt diese mit Kolben:

Bedeutet, dass der Anschluss, den Sie zu binden, sind versucht, bereits in verwendet wird, ist durch ein anderer Dienst oder Prozess: bekam einen Hinweis auf das in meinem Code auf Eclipse/Windows entwickelt:

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) 
+0

Werfen Sie einen Blick hier: https://answers.microsoft.com/en-us/windows/forum/windows_7-networking/socket-10013-error-when-trying-to-connect-some/2cc71cb6-24b2-4b63- 8f60-32bb444eb8fd? Auth = 1 –

Verwandte Themen