通过主机名连接套接字有效,但并非所有端口都可用

1 投票
1 回答
5863 浏览
提问于 2025-04-17 14:37

我想了解一下套接字是怎么工作的,所以我浏览了一下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

但是

  1. 当我尝试通过主机名连接到另一个端口时,连接是成功的:

    In [4]: s.connect((HOST, 22))
    
    In [5]: s.recv(1024)
    Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
    

    (显然,服务器上并不是我的应用程序在处理这个连接)。

  2. 当我把服务器代码中的主机名改成本地的IP地址时,我也能连接到我的端口(使用IP作为主机字符串)。

这些情况的组合让我感到困惑。有没有人能解释一下这种行为?

编辑:似乎如果我在服务器代码中也使用IP地址,我可以用HOST连接。但是为什么不按照HOWTO中的方式工作呢?

1 个回答

5

绑定到 "" 而不是 HOST:

ssock.bind(("", PORT))

撰写回答