socket.error: [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, в server = 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?

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


person bitcycle    schedule 06.05.2010    source источник
comment
Ваша учетная запись локального администратора не может быть привязана к порту 80, потому что к ней уже привязан другой процесс (сервер). telnet 127.0.0.1 80 быстро покажет, привязан ли порт 80.   -  person msw    schedule 06.05.2010
comment
@msw Это должно дать другую ошибку.   -  person Daniel Stutzbach    schedule 06.05.2010
comment
@ msw / все отмечают, что клиент telnet не по умолчанию не устанавливается на Win7.   -  person pythonlarry    schedule 18.02.2014


Ответы (15)


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

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

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

person lunixbochs    schedule 06.05.2010
comment
убедитесь, что вы import ctypes перед запуском ctypes.windll.shell32.IsUserAnAdmin() - person northben; 27.05.2013

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

person David    schedule 18.02.2013
comment
Так было у меня на Win8 - person Asken; 10.01.2014
comment
я также смог решить эту ошибку, изменив порт приложения в Win8 - person Neeraj Singh; 12.06.2016
comment
Или остановите / измените процесс, использующий другой порт. Множество способов узнать, какой процесс: stackoverflow.com/questions/48198/ - person Neal Gokli; 08.02.2018
comment
добавил python.exe и теперь могу запускать мой код в Windows PowerShell. Благодарность! - person wraithie; 30.03.2019

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

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

netstat -ban
person kuz8    schedule 19.09.2015

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

python manage.py runserver 127.0.0.1:7000

Объяснение:

как упоминалось в документации Django:

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

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

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

person Hardipinder Singh    schedule 04.03.2019
comment
@Armali Я надеюсь, что это дает правдоподобное объяснение - person Hardipinder Singh; 04.03.2019

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

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

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

person frmdstryr    schedule 15.08.2014
comment
Спасибо, человек спас мне жизнь, я застрял на последние 2 дня, внес много изменений, но работал с этим решением - person OBAID; 19.09.2016

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)
person A.HEDDAR    schedule 31.07.2017
comment
Посмотрите здесь: answers.microsoft.com/en-us/windows/forum/windows_7-networking/ - person Emanuela Colta; 24.12.2017

Ваш локальный порт используется другим приложением. Я столкнулся с такой же проблемой! Вы можете попробовать следующий шаг:

  1. Заходим в командную строку и запускаем от имени администратора!

  2. Тип:

    netstat -ano | find ":5000"
    => TCP    0.0.0.0:5000           0.0.0.0:0              LISTENING       4032
       TCP    [::]:5000              [::]:0                 LISTENING       4032
    
  3. Тип:

    TASKKILL /F /PID 4032
    

=> УСПЕХ: процесс с PID 4032 был прекращен.

Примечание. Мой локальный порт 5000 был указан по PID 4032. Вы должны указать свой!

person rafee noor    schedule 16.03.2020

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

person Pythonista    schedule 25.09.2018

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

person Brent Smith    schedule 12.10.2013

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

person Sameer Kumar Choudhary    schedule 19.01.2019

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

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

python manage.py runserver 127.0.0.1:portnumber
Ex: python manage.py runserver 127.0.0.1:8080
person Thusitha Deepal    schedule 25.04.2019
comment
В Windows вы можете просмотреть используемые номера портов, используемые различными приложениями в диспетчере задач Windows. Я их не вижу. Пожалуйста, дважды проверьте это и предоставьте инструкции. - person S Meaden; 27.07.2019

Я решил это в Windows 10, отредактировав правило брандмауэра для исходящего трафика. Щелкните правой кнопкой мыши разрешить в правиле Блокировать доступ к сети для учетных записей локальных пользователей R в экземпляре SQL Server MSSQLSERVER

из брандмауэра Windows 10 - исходящие правила - это то, что блокировало мой экземпляр

Снимок экрана с брандмауэра Windows 10 - правила для исходящего трафика - это то, что блокировало мой экземпляр

person Lawrence Patrick    schedule 07.03.2020

Отключить защиту доступа в антивирусе,

Я столкнулся с той же проблемой, наконец, нашел журналы ниже от антивируса.

Заблокировано правилом защиты доступа NT AUTHORITY \ SYSTEM C: \ WINDOWS \ SYSTEM32 \ SVCHOST.EXE C: \ PROGRAM FILES (X86) \ MCAFEE \ VIRUSSCAN ENTERPRISE \ MCCONSOL.EXE Общая стандартная защита: предотвращение завершения процессов McAfee Действие заблокировано: Завершить заблокировано по правилу блокировки портов C: \ USERS \ username \ APPDATA \ LOCAL \ PROGRAMS \ PYTHON \ PYTHON37-32 \ PYTHON.EXE Стандартная антивирусная защита: предотвращение отправки почты червями массовой рассылки

person Rahul Raj    schedule 12.08.2019

Я только что обнаружил, что в моем случае Kaspersky Internet Security 2019 Firewall блокировал сетевой доступ для Python. Отключение брандмауэра работает плавно. Или добавление правил исключения для приложения Python и всех расширений файлов с * .py также будет работать.

person Engr Syed Rowshan Ali    schedule 15.05.2020
comment
не могли бы вы показать более конкретную информацию и показать мне, как добавить дополнительные правила? Поскольку я проверил, питон является правдой Касперского. - person Jay; 27.10.2020

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

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

person sundar moses    schedule 09.11.2014
comment
Это небезопасно, поскольку он запускает все скрипты Python с правами администратора. Более того, на этот вопрос уже несколько лет существует общепринятый ответ. - person ; 09.11.2014