通过主机名连接套接字有效,但并非所有端口都可用
我想了解一下套接字是怎么工作的,所以我浏览了一下HOWTO和文档,然后尝试写自己的代码。服务器端的代码是这样的:
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
assert socket.gethostname() == HOST
ssock.bind((HOST, PORT))
ssock.listen(5)
while True:
csock, address = ssock.accept()
print('Accepted connection from', address)
t = threading.Thread(target=server, args=(csock,))
t.start()
客户端的代码是:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
这两个代码在同一个模块里,所以常量是一样的。但是这段代码不管用。当我尝试连接时,出现了一个错误:ConnectionRefusedError: [Errno 111] Connection refused
。
但是:
当我尝试通过主机名连接到另一个端口时,连接是成功的:
In [4]: s.connect((HOST, 22)) In [5]: s.recv(1024) Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
(显然,服务器上并不是我的应用程序在处理这个连接)。
当我把服务器代码中的主机名改成本地的IP地址时,我也能连接到我的端口(使用IP作为主机字符串)。
这些情况的组合让我感到困惑。有没有人能解释一下这种行为?
编辑:似乎如果我在服务器代码中也使用IP地址,我可以用HOST
连接。但是为什么不按照HOWTO中的方式工作呢?
1 个回答
5
绑定到 "" 而不是 HOST:
ssock.bind(("", PORT))