разъем.ошибка: [Errno 10013] была предпринята попытка получить доступ к сокету способом, запрещенным его разрешениями доступа

Я пытаюсь создать пользовательский стек TCP с помощью Python 2.6.5 в Windows 7 для обслуживания допустимых запросов http-страниц на порту 80 локально. Но я столкнулся с проблемой, которая кажется Windows 7 ужесточила безопасность. Этот код работал на Vista.

вот мой пример кода:

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 (последний звонок):
Файл "TestServer.py", строка 19, in сервер= SocketServer.TCPServer ((хост, порт), MyTCPHandler Файл) "C:Python26libSocketServer.py", строка 400, в init личность.server_bind () файл "C:Python26libSocketServer.py", строка 411, в server_bind личность.разъем.bind (self.адрес сервера) Файл"", строка 1, в bind

гнездо.ошибка: [Errno 10013] попытка доступа к сокету таким образом запрещено его разрешения доступа

как именно я могу заставить это работать на Windows 7?

[Edit on 5/5/2010 @ 2344 PDT] это ответ объясняет, что ошибка вызвана необходимостью повышенных / привилегий суперпользователя при доступе к портам ниже 1024. Я собираюсь попробовать использовать более высокий номер порта, чтобы увидеть, если это работает. Однако я все равно хотел бы знать, почему моя учетная запись локального администратора не может получить доступ к порту 80.

8 ответов


в Windows Vista/7 с помощью UAC учетные записи администратора по умолчанию запускают программы в непривилегированном режиме.

программы должны запрашивать доступ администратора перед запуском от имени администратора с помощью хорошо знакомого диалога UAC. Поскольку скрипты Python не являются непосредственно исполняемыми, нет опции контекстного меню "запуск от имени администратора".

можно использовать ctypes.windll.shell32.IsUserAnAdmin() чтобы определить, имеет ли скрипт доступ администратора, и ShellExecuteEx с глаголом 'runas' на питон.exe, с sys.argv[0] в качестве параметра для запроса диалога UAC при необходимости.


Я только что столкнулся с той же проблемой, моя система Win7. просто используйте команду на терминале, например: netstat-na / findstr port, вы увидите, что порт был использован. Так что если вы хотите запустить сервер без этого сообщения, Вы можете изменить другой порт, который не используется.


McAfee блокировал его для меня. Я должен был разрешить программу в правилах защиты доступа

  1. Открыть VirusScan
  2. щелкните правой кнопкой мыши на защите доступа и выберите Свойства
  3. нажмите на "антивирусная стандартная защита"
  4. выберите правило "предотвратить массовую рассылку червей от отправки почты" и нажмите edit
  5. добавьте приложение в список процессов для исключения и нажмите OK

посмотреть http://www.symantec.com/connect/articles/we-are-unable-send-your-email-caused-mcafee


для меня это было жаловаться, как на Windows 7 x64, когда у меня был другой процесс, уже прослушивающий тот же порт.

можно увидеть занятые (связанные) порты, запустив

netstat -ban

гнездо.ошибка: [Errno 10013] была предпринята попытка получить доступ к сокету способом, запрещенным его разрешениями доступа

У с колбы :

означает, что порт, к которому вы пытаетесь привязаться,уже используется другой службой или процесс : получил подсказку об этом в моем коде, разработанном на Eclipse / windows:

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)

Я должен был позволить ..\ python27\python.exe в Брандмауэре windows. Мне не нужно делать это на WinXP или Win8.


просто запустите на портах выше 1024, что-нибудь ниже привилегировано, это то же самое дело с Linux, я использую 5000, например, на wins без эскалации UAC priv.


Я нашел решение для решения этой проблемы в Python.

перейти к c:\python27\ каталог и rigtlcick python.вкладка exe и в compaitbility и выберите опцию с правами администратора и применить изменения. Теперь вы выдаете команду, которая позволяет создать соединение сокета.