socket.error: [Errno 10013] Была сделана попытка получить доступ к сокету способом, запрещенным его правами доступа - PullRequest
27 голосов
/ 06 мая 2010

Я пытаюсь создать собственный стек 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, в сервер = SocketServer.TCPServer ((HOST, PORT), MyTCPHandler) Файл "C: \ Python26 \ Lib \ SocketServer.py", строка 400, в init self.server_bind () Файл "C: \ Python26 \ lib \ SocketServer.py", строка 411, в server_bind self.socket.bind (self.server_address) Файл "", строка 1, в связке

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

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

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

Ответы [ 11 ]

31 голосов
/ 18 февраля 2013

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

18 голосов
/ 06 мая 2010

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

Программы должны запрашивать доступ администратора перед тем, как запускаться от имени администратора, с очень знакомым диалоговым окном UAC. Поскольку сценарии Python не могут быть непосредственно выполнены, нет опции контекстного меню «Запуск от имени администратора».

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

11 голосов
/ 15 августа 2014

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

  1. Открыть VirusScan
  2. Щелкните правой кнопкой мыши на Защита доступа и выберите Свойства
  3. Нажмите «Стандартная антивирусная защита»
  4. Выберите правило «Запретить рассылку червей массовой рассылки» и нажмите «Изменить»
  5. Добавьте приложение в список процессов для исключения и нажмите OK

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

8 голосов
/ 20 сентября 2015

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

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

netstat -ban
4 голосов
/ 31 июля 2017

socket.error: [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)
3 голосов
/ 04 марта 2019

Попробуйте запустить сервер на другом порту. Работал для меня:

python manage.py runserver 127.0.0.1:7000

Объяснение:

как указано в документации Django:

Если вы запустите этот скрипт как пользователь с обычными привилегиями (рекомендуется), у вас может не быть доступа для запуска порта с низким номером порта. Младшие номера портов зарезервированы для суперпользователя (root).

Этот сервер использует объект приложения WSGI, заданный параметром WSGI_APPLICATION.

НЕ ИСПОЛЬЗУЙТЕ ЭТОТ СЕРВЕР В НАСТРОЙКЕ ПРОИЗВОДСТВА. Он не прошел аудит безопасности или тесты производительности. (И так оно и будет. Мы занимаемся созданием веб-фреймворков, а не веб-серверов, поэтому улучшение этого сервера для обработки производственной среды выходит за рамки Django.)

2 голосов
/ 13 октября 2013

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

1 голос
/ 25 сентября 2018

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

0 голосов
/ 25 апреля 2019

Основная проблема - номер порта, используемый другим приложением. Поэтому вы можете изменить номер порта на неиспользуемый, как показано ниже.

В окнах вы можете просматривать номера используемых портов в разных приложениях в диспетчере задач Windows.

python manage.py runserver 127.0.0.1:portnumber
Ex: python manage.py runserver 127.0.0.1:8080
0 голосов
/ 19 января 2019

Кажется, порт 80 уже используется. Попробуйте использовать другой порт, который не используется никаким другим приложением в вашей системе.

...