当前位置: 首页 > 知识库问答 >
问题:

Swift-获取ipv6链接本地地址?

周锐
2023-03-14

我检查了下面的代码以获取ipv6地址,这段代码返回了全局单播地址,比如“2001:x:x…”。但我想获得链接本地地址,比如“fe80:…”。如何使用以下代码获取链接本地地址?

static var ipAddress: String? {
    var ipv6 : String?
    var ifaddr : UnsafeMutablePointer<ifaddrs>?
    guard getifaddrs(&ifaddr) == 0 else { return (nil, nil) }
    guard let firstAddr = ifaddr else { return (nil, nil) }

    for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
        let interface = ifptr.pointee
        let addrFamily = interface.ifa_addr.pointee.sa_family
        if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
            let name = String(cString: interface.ifa_name)
            if  name == "en0" {
                var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),&hostname, socklen_t(hostname.count),nil, socklen_t(0), NI_NUMERICHOST)
                ipv6 = String(cString: hostname)
            }
        }
    }
    freeifaddrs(ifaddr)
    return ipv6
}

共有1个答案

闻人举
2023-03-14

该系统包括文件netinet6/in6。定义宏

#define IN6_IS_ADDR_LINKLOCAL(a)        \
        (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))

该宏并没有被导入Swift,但显示了我们必须如何进行。以下循环修改(来自Swift-Get设备的WIFI IP地址)将查找所有IPv6链路本地地址:

for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
    let interface = ifptr.pointee
    let addrFamily = interface.ifa_addr.pointee.sa_family
    if addrFamily == UInt8(AF_INET6) {
        // Get the sin6_addr part of the sockaddr as UInt8 "array":
        let s6_addr = interface.ifa_addr.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) {
            $0.pointee.sin6_addr.__u6_addr.__u6_addr8
        }
        // Check for link-local address:
        if s6_addr.0 == 0xfe && (s6_addr.1 & 0xc0) == 0x80 {
            let name = String(cString: interface.ifa_name)

            // ...
        }
    }
}

 类似资料:
  • 我无法理解为什么这个命令不起作用: 注意:我已经用把上面的链接本地地址弄错了,但我有一些有效的链接本地ipv6地址是端口号。 我得到了一个错误: 我也试着放单引号/双引号,但结果是同样的错误: 我使用的是OpenSSL 1.1.0f版本,它应该支持IPv6。 使用IPv4地址,它可以工作。

  • 所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。 尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。

  • 此函数创建sockaddr_in6: 基本上,如果地址是IPv4地址,我会在它前面加上,并将该族设置为af_inet。 这有可能做到。如果是,我做错了什么?

  • 以下是托管Web服务器的机器的ipconfig输出: 以太网适配器局域网连接: 特定于连接的DNS后缀:链接本地IPv6地址…:fe80::f85b:4256:ee76:24a4∗IPv4地址………:10.213.254.119子网掩码………:255.255.255.0默认网关……:10.213.254.252 我可以使用以下方式访问该网站:http://10.213.254.119/test“现

  • 此外,如果我在设备中启用IPv4,那么也会生成IPv6链路本地地址。 有谁能解释一下,为了生成本地链接地址,Android设备实际上是在消耗什么?根据我的理解,链接本地地址应该始终存在,无论什么情况下,当链接打开。

  • 问题内容: 如何在Swift中获取本地日期和时间? 问题答案: 我已经找到答案了。