我需要将监听套接字绑定到哪个主机?

4 投票
3 回答
5685 浏览
提问于 2025-04-15 23:13

我使用了Python的socket模块,尝试通过以下代码打开一个监听的socket:

import socket
import sys

def getServerSocket(host, port):
    for r in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
                                socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
        af, socktype, proto, canonname, sa = r
        try:
            s = socket.socket(af, socktype, proto)
        except socket.error, msg:
            s = None
            continue
        try:
            s.bind(sa)
            s.listen(1)
        except socket.error, msg:
            s.close()
            s = None
            continue
        break
    if s is None:
        print 'could not open socket'
        sys.exit(1)
    return s

这里的host设置为None,端口是15000。

程序可以接受连接,但只能来自同一台机器的连接。我需要做些什么才能接受来自互联网的连接呢?

3 个回答

2

你需要把它绑定到你的公共IP地址,或者绑定到“所有”地址(通常用“0.0.0.0”表示)。

如果你想在网络上访问它,你可能还需要考虑防火墙等问题。

5

第一个问题是,你的异常处理块在出现错误时没有报告任何信息,直接把错误吞掉了。第二个问题是,你试图绑定到一个特定的接口,而不是使用 INADDR_ANY。你可能是绑定到了“localhost”,这样的话只会接受来自本机的连接。

INADDR_ANY 也被称为常量 0x00000000,但使用这个宏会更容易理解。

假设你在使用 IPv4(也就是现在的“普通互联网”),可以从 socket 模块页面 的第一个示例中复制 socket/bind 的代码。

8

试试 0.0.0.0。这是最常用的。

撰写回答