socket.error: [错误 10013] 尝试以禁止的方式访问套接字
我正在尝试在Windows 7上使用Python 2.6.5创建一个自定义的TCP协议栈,以便在本地的80端口上处理有效的http页面请求。但是,我遇到了一个问题,看起来是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 报错信息(最近的调用在最前面):
文件 "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行,在 bindsocket.error: [Errno 10013] 尝试以不允许的方式访问一个socket
我该如何在Windows 7上让这个程序正常工作呢?
[编辑于2010年5月5日 @ 2344 PDT] 这个 回答 解释了这个错误是因为访问低于1024的端口需要更高的权限/超级用户权限。我打算试试使用一个更高的端口号,看看是否能解决问题。不过,我还是想知道为什么我的本地管理员账户无法访问80端口。
23 个回答
试着在不同的端口上运行服务器。这样做对我有效:
python manage.py runserver 127.0.0.1:7000
解释:
正如Django文档中提到的:
如果你以普通用户的身份运行这个脚本(推荐这样做),你可能没有权限在低端口号上启动服务。低端口号是留给超级用户(root)的。
这个服务器使用的是由WSGI_APPLICATION设置指定的WSGI应用对象。
请不要在生产环境中使用这个服务器。它没有经过安全审计或性能测试。(而且这种情况不会改变。我们专注于开发Web框架,而不是Web服务器,所以让这个服务器能够处理生产环境的需求并不在Django的工作范围内。)
我刚遇到同样的问题,我的系统是Win7。你可以在命令行里输入这个命令:netstat -na|findstr port,这样你就能看到哪个端口已经被占用了。如果你想在没有这个提示的情况下启动服务器,可以换一个没有被占用的端口。
在Windows Vista和7系统中,由于有用户账户控制(UAC),管理员账户默认情况下运行程序时权限是有限的。
程序在运行时需要请求管理员权限,这时会弹出我们熟悉的UAC对话框。因为Python脚本不能直接执行,所以没有“以管理员身份运行”的选项。
可以使用 ctypes.windll.shell32.IsUserAnAdmin()
来检查脚本是否有管理员权限,如果需要的话,可以用 ShellExecuteEx
和 'runas' 这个命令来运行python.exe,同时把 sys.argv[0] 作为参数,这样就能在需要时弹出UAC对话框。