Python HTTPserver 错误

0 投票
2 回答
1774 浏览
提问于 2025-04-18 12:11

你好,我有以下这段代码:

import os, sys
from http.server import HTTPServer, CGIHTTPRequestHandler

webdir = '.'
port = 80
if len(sys.argv) > 1: webdir = sys.argv[1]
if len(sys.argv) > 2: port = int(sys.argv[2])
print("webdir '%s', port %s" % (webdir, port))

os.chdir(webdir)
svraddr = (" ", port)
srvrobj = HTTPServer(svraddr, CGIHTTPRequestHandler)
srvrobj.serve_forever()

但是,如果我用管理员权限运行这段代码,它会返回一个错误:

Traceback (most recent call last):
  File "C:\Users\Nitro\Desktop\web server\webserver.py", line 12, in <module>
    srvrobj = HTTPServer(svraddr, CGIHTTPRequestHandler)
  File "C:\Python33\lib\socketserver.py", line 430, in __init__
    self.server_bind()
  File "C:\Python33\lib\http\server.py", line 135, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "C:\Python33\lib\socketserver.py", line 441, in server_bind
    self.socket.bind(self.server_address)
socket.gaierror: [Errno 11004] getaddrinfo failed

这是怎么回事呢?

2 个回答

1

试着把这个:

svraddr = (" ", port)

改成这个:

svraddr = ("", port)
1

对我来说,修改这一行:

svraddr = (" ", port)

成:

svraddr = ("", port)

就能解决你的问题。这里的字符串(" ")表示套接字应该“绑定”到哪个接口:它应该是你机器上某个接口的IP地址,但如果不是,Python似乎会尝试去查找(解析)它。" "是无法解析的。''表示“所有接口”:

对于IPv4地址,有两种特殊形式可以代替主机地址:空字符串表示INADDR_ANY

INADDR_ANY就是0.0.0.0,所以更明确的说法是:

svraddr = ('0.0.0.0', port)

“0.0.0.0”意味着“所有接口”。你的网页服务器会在它绑定的接口上监听(大致上说,就是网络卡),在这个例子中,是所有的接口。通常情况下,如果你有多个接口,绑定到特定的接口会更有用;还有一个回环接口,它使得只有你的机器可以连接到网页服务器:

svraddr = ('127.0.0.1', port)

(或者,使用之前让我们困惑的名称查找功能)

svraddr = ('localhost', port)

撰写回答