Python socket的gethostbyname()仅返回一个IP地址。

6
我正在使用Python套接字进行一些简单的实验,其中我有一个主机名,它解析出两个IP地址,但是当我使用 socket.gethostbyname('demo.sample.com') 时,我只得到一个IP地址。为什么会这样显示呢?我是否可以以其他方式获取多个IP地址? 修改 - 1 我明白了,不要使用 gethostbyname('demo.sample.com'),而要尝试使用 gethostbyname_ex('demo.sample.com'),这将给出我所期望的结果。

通常DNS将单个主机解析为单个IP地址。你为什么期望多于一个呢? - Alexander O'Mara
1
这只是对C库gethostbyname的一个包装器,如果有任何答案,它只会给你一个。如果您想深入了解DNS细节,您需要一个DNS模块,例如pydnsdnspython - Cong Ma
@Alexander O'Mara,一个主机名可以分配多个IP地址,我想知道给定主机名的IP地址是什么,简单地说,我只想要Linux中“nslookup”命令的结果。 - Sundararajan
@AlexanderO'Mara 如果您在调用gethostbyname时使用的是位于您的局域网上的设备,则您的查询不会传递到DNS。您的任何设备都可以具有多个接口,每个接口都有自己的IP地址。我在我的笔记本电脑上有大约6个不同的接口/ IP地址(其中一些是VirtualBox适配器)。 - vasia
2个回答

11

根据文档,可以看出:

  • gethostbyname仅能返回单个IPv4地址。引用一下:
    查看更完整的接口,请使用gethostbyname_ex()。
  • gethostbyname_ex将返回多个IPv4地址,但需要注意用法。引用一下:
    gethostbyname_ex()不支持IPv6名称解析,应使用getaddrinfo()来实现IPv4/v6双栈支持。
  • getaddrinfo将返回所有IPv4和IPv6地址,但需要注意用法。

0

我在这里找到了一个解决方案,它可以返回内部网络IP:

import socket


def ip_addr(hostIP=None):
    if hostIP is None or hostIP == 'auto':
        hostIP = 'ip'

    if hostIP == 'dns':
        hostIP = socket.getfqdn()
    elif hostIP == 'ip':
        from socket import gaierror
        try:
            hostIP = socket.gethostbyname(socket.getfqdn())
        except gaierror:
            logger.warn('gethostbyname(socket.getfqdn()) failed... trying on hostname()')
            hostIP = socket.gethostbyname(socket.gethostname())
        if hostIP.startswith("127."):
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # doesn't have to be reachable
            s.connect(('10.255.255.255', 1))
            hostIP = s.getsockname()[0]
    return hostIP


if __name__ == '__main__':
    print('%s' % ip_addr())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接