【问题标题】:Reliably get IPV6 Address in Python在 Python 中可靠地获取 IPV6 地址
【发布时间】:2013-04-23 00:24:24
【问题描述】:

我现在这样做:

def get_inet_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('mysite.com', 80))
    return s.getsockname()[0]

这是基于: Finding local IP addresses using Python's stdlib

但是,这看起来有点可疑。据我所知,它打开一个到 mysite.com:80 的套接字,然后返回该套接字的第一个地址,假设它是一个 IPv4 地址。这似乎有点狡猾......我认为我们无法保证会是这样。

这是我的第一个问题,它安全吗?在启用 IPv6 的服务器上,是否会意外返回 IPv6 地址?

我的第二个问题是如何以类似的方式获取 IPv6 地址。我将修改函数以采用可选的 ipv6 参数。

【问题讨论】:

  • 这不是 IPv4 的可靠方法。
  • 是的,我不这么认为。请进一步解释。

标签: python sockets ipv6


【解决方案1】:

问题是,你只是想连接,还是真的想要地址?

如果你只是想连接,你可以这样做

s = socket.create_connection(('mysite.com', 80))

并建立连接。

但是,如果您对该地址感兴趣,您可以采用以下方式之一:

def get_ip_6(host, port=0):
    import socket
    # search only for the wanted v6 addresses
    result = socket.getaddrinfo(host, port, socket.AF_INET6)
    return result # or:
    return result[0][4][0] # just returns the first answer and only the address

或者,更接近another, already presented solution

def get_ip_6(host, port=0):
     # search for all addresses, but take only the v6 ones
     alladdr = socket.getaddrinfo(host,port)
     ip6 = filter(
         lambda x: x[0] == socket.AF_INET6, # means its ip6
         alladdr
     )
     # if you want just the sockaddr
     # return map(lambda x:x[4],ip6)
     return list(ip6)[0][4][0]

【讨论】:

  • 是的,我想要 IP,它进入配置文件。
【解决方案2】:

你应该使用函数socket.getaddrinfo()

获取 IPv6 的示例代码

def get_ip_6(host,port=80):
    # discard the (family, socktype, proto, canonname) part of the tuple
    # and make sure the ips are unique
    alladdr = list(
        set(
            map(
                lambda x: x[4],
                socket.getaddrinfo(host,port)
            )
        )
    )
    ip6 = filter(
        lambda x: ':' in x[0], # means its ip6
        alladdr
    )
    return ip6

【讨论】:

  • 我会发现过滤结果的地址族字段更好,而不是返回地址的文本表示。看我的回答。
  • @glglgl 是的,你是对的,这只是一个快速而肮脏的例子。重点主要是将他重定向到 socket.getaddrinfo() 文档。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2012-07-19
  • 2021-06-21
  • 2012-02-24
  • 1970-01-01
  • 2019-01-16
  • 2014-01-11
相关资源
最近更新 更多