使用套接字通过主机名连接,但不适用于所有端口

时间:2013-02-03 16:07:23

标签: python sockets networking

我想知道套接字是如何工作的,所以我浏览了HOWTOdocs并尝试编写自己的代码。服务器端看起来像这样:

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作为主机字符串)。

  3. 这些情况的结合让我感到困惑。任何人都可以解释这种行为吗?

    如果我在服务器代码中使用IP,

    编辑:似乎可以与HOST连接。但为什么它不像HOWTO那样起作用?

1 个答案:

答案 0 :(得分:3)

绑定到“”而不是HOST:

ssock.bind(("", PORT))