套接字错误:[Errno 10013] 试图以被其访问权限禁止的方式访问套接字

66

我正在尝试使用Python 2.6.5在Windows 7上创建自定义TCP堆栈,以便本地提供有效的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 (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

在Windows 7上怎么才能让这个工作?
[2010年5月5日编辑 @ 2344 PDT]这个答案解释了访问低于1024端口时需要提升/超级用户权限的原因。我将尝试使用更高的端口号来测试是否可行。但是,我仍然想知道为什么我的本地管理员帐户无法访问端口80。


8
由于已经有其他进程(服务器)绑定了端口80,因此您的本地管理员帐户可能无法绑定该端口。使用“telnet 127.0.0.1 80”命令可以快速检查端口80是否已经被绑定。 - msw
1
@msw 这应该会给出不同的错误。 - Daniel Stutzbach
4
请注意,Win7默认没有安装Telnet客户端。 - pythonlarry
24个回答

60

我刚遇到了同样的问题,我的系统是Win7。只需在终端上使用命令:netstat -na|findstr port,就可以看到端口已经被使用了。所以,如果你想在没有这个消息的情况下启动服务器,你可以更改其他未被使用的端口。


4
在Win8上对我而言是这种情况。 - Asken
2
我也成功解决了这个错误,通过在Win8中更改应用程序端口。 - Neeraj Singh
1
或者停止/更改使用另一个端口的进程。有很多方法可以找到哪个进程:https://dev59.com/nXVD5IYBdhLWcg3wOo5h - Neal Gokli
已添加python.exe,现在可以在Windows PowerShell中运行我的代码了。谢谢! - wraithie

33

尝试在不同的端口上运行服务器。对我有用:

python manage.py runserver 127.0.0.1:7000

说明:

正如在Django文档中提到的那样:

如果您以普通用户权限(建议)运行此脚本,则可能无法访问低端口号上的端口。低端口号保留供超级用户(root)使用。

该服务器使用由WSGI_APPLICATION设置指定的WSGI应用程序对象。

请勿在生产环境中使用此服务器。它没有经过安全审核或性能测试。(这就是它将保持的方式。我们从事的是制作Web框架,而不是Web服务器,因此改进此服务器以处理生产环境超出Django的范围。)


1
@Armali,我希望这提供了一个合理的解释。 - Hardipinder Singh

29

在Windows Vista/7中,通过UAC管理员帐户默认以非特权模式运行程序。

程序必须在以管理员身份运行之前提示管理员访问权限,弹出熟悉的UAC对话框。由于Python脚本不能直接执行,因此没有“以管理员身份运行”上下文菜单选项。

可以使用ctypes.windll.shell32.IsUserAnAdmin()来检测脚本是否具有管理员访问权限,并使用ShellExecuteEx执行python.exe时带上 'runas' 参数和sys.argv[0]作为参数,以在需要时提示UAC对话框。


1
在运行 ctypes.windll.shell32.IsUserAnAdmin() 之前,请确保您已经 import ctypes - northben

18

对于我而言,在Windows 7 x64上出现这种情况是因为另一个进程已经在监听相同的端口。

可以通过运行以下命令来查看当前被占用(绑定)的端口:

netstat -ban

12

1
谢谢,老兄,你救了我的命。我卡在这里已经两天了,做了很多改变,但是从这个解决方案开始就行了。 - OBAID

9
您的本地端口被另一个应用程序使用。我也遇到了相同的问题!您可以尝试以下步骤:
  1. Go to command line and run it as administrator!

  2. Type:

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

    TASKKILL /F /PID 4032
    

=> 成功:PID为4032的进程已经终止。

注意:我的本地5000端口被PID为4032的进程占用。你需要确定你自己的PID。


1
在盲目终止进程ID之前,查看使用该端口的应用程序可能是个好主意。为此,请参阅SysInternals中的pslist(和pskill)。 - matt wilkie

8

socket.error: [Errno 10013] 试图访问一个由其访问权限禁止的套接字

在使用flask时出现了这个错误:

意味着您尝试绑定的端口已被另一个服务或进程占用: 在我开发于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)

请看这里: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 - Emanuela Colta

4

只需在1024以上的端口运行,低于此端口是特权端口,在Linux中也是同样的情况。例如,在Windows上我使用5000端口而不需要任何UAC权限提升。


3

这是一个简单的解决方案。此错误可能是由于在您尝试运行应用程序的端口上运行的另一个进程或一组进程引起的。 以管理员身份打开cmd 如果您已将服务器设置为服务并且服务中断,则也可能发生此情况。 请执行以下命令:

netstat -ano | findstr portNo

您将能够看到该端口上活动任务的列表。 您可以使用以下方法关闭所有不必要的任务:

taskkill/pid taskNo /F

完成后请重新启动您的服务器。


3

看起来端口80已经被占用了。尝试使用系统中没有被其他应用程序占用的其他端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接