2010-05-06 5 views
21

Sto provando a creare uno stack TCP personalizzato utilizzando Python 2.6.5 su Windows 7 per servire una pagina http valida richieste sulla porta 80 localmente. Ma, ho incontrato un ostacolo con quello che sembra Windows 7 ha rafforzato la sicurezza. Questo codice ha funzionato su Vista.socket.error: [Errno 10013] Si è tentato di accedere a un socket in un modo vietato dalle sue autorizzazioni di accesso

Ecco il mio codice di esempio:

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

Esattamente come faccio a farlo funzionare su Windows 7?

[Modifica in 5/5/2010 @ 2344 PDT] Questo answer spiega che l'errore è causato dalla necessità di privilegi elevati/superutente quando si accede a porte inferiori a 1024. Ho intenzione di provare a utilizzare un numero di porta più alto per vedere se funziona. Tuttavia, vorrei ancora sapere perché il mio account amministratore locale non può accedere alla porta 80.

+4

tuo account di amministratore locale potrebbe non essere in grado di legarsi alla porta 80 perché c'è già un altro processo (server) rilegato ad esso. 'telnet 127.0.0.1 80' mostrerà rapidamente se la porta 80 è già associata. – msw

+1

@msw Questo dovrebbe dare un errore diverso. –

+0

@ msw/tutti notano che [un client telnet non è installato su Win7 per impostazione predefinita.] (Http://technet.microsoft.com/en-us/library/cc771275%28v=ws.10%29.aspx) – pythonlarry

risposta

15

Su Windows Vista/7, con controllo dell'account utente, gli account amministratore eseguono programmi in modalità non privilegiata per impostazione predefinita.

I programmi devono richiedere l'accesso di amministratore prima che vengano eseguiti come amministratore, con la finestra di dialogo UAC sempre familiare. Poiché gli script Python non sono direttamente eseguibili, non esiste un'opzione del menu di scelta rapida "Esegui come amministratore".

E 'possibile utilizzare ctypes.windll.shell32.IsUserAnAdmin() per rilevare se lo script ha accesso admin, e ShellExecuteEx con il verbo 'runas' su python.exe, con sys.argv [0] come parametro per richiedere la finestra di UAC, se necessario.

+0

assicurati di importare ctypes prima dell'esecuzione di 'ctypes.windll.shell32.IsUserAnAdmin()' – northben

22

Ho appena riscontrato lo stesso problema, il mio sistema è Win7. basta usare il comando sul terminale come: netstat -na | findstr port, vedrai che la porta è stata usata. Quindi, se vuoi avviare il server senza questo messaggio, puoi cambiare un'altra porta che non è stata utilizzata.

+3

Questo è stato il caso per me su Win8 – Asken

+1

Sono stato anche in grado di risolvere questo errore cambiando la porta dell'applicazione in Win8 – Neeraj

+0

Oppure stop/cambia il processo che sta usando l'altra porta. Molti modi per trovare quale processo: https://stackoverflow.com/questions/48198/how-can-you-find-out-which-process-is-listening-on-a-port-on-windows –

1

Ho dovuto consentire .. \ python27 \ python.exe nel firewall di Windows. Non ho bisogno di farlo su WinXP o Win8.

8

McAfee lo stava bloccando per me. Ho dovuto consentire al programma nelle regole di protezione di accesso

  1. Aprire VirusScan
  2. Fai clic destro su Access Protection e scegliere Proprietà
  3. cliccare su "Anti-Virus Protection Standard"
  4. Selezionare regola "di massa Prevenire mailing worm di inviare posta elettronica" e fare clic su Modifica
  5. Aggiungere l'applicazione ai Processi da escludere dall'elenco e fare clic su OK

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

+0

Grazie amico salvato la mia vita è rimasta bloccata per 2 giorni passati a fare molte modifiche ma ho lavorato con questa soluzione – OBAID

-3

Ho trovato una soluzione per risolvere questo problema in Python.

passare a c: \ python27 \ directory e rigtlcick python.exe e scheda per compaitbility e selezionare l'opzione privilegio di amministrazione e applicare le modifiche. Ora si impartisce il comando che consente di creare la connessione socket.

+5

Questo non è sicuro poiché esegue * tutti * gli script Python con privilegi di amministratore. Inoltre, la domanda ha avuto una risposta accettata per diversi anni. –

7

Per me è stato lamentarsi così su Windows 7 x64 quando avevo già un altro processo in ascolto su quella stessa porta.

È possibile vedere porte attualmente occupati (rilegate) eseguendo

netstat -ban 
3

socket.error: [Errno 10013] Si è tentato di accedere a una presa in maniera vietata dai suoi permessi di accesso

ottenuto questo con pallone:

significa che la porta si sta cercando di legarsi a, è già in utilizzato da un altro servizio o un processo: ottenuto un suggerimento su questo nel mio codice sviluppato su Eclipse/finestre:

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

Dai un'occhiata qui: 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 –

Problemi correlati