【问题标题】:Do a simple DNS lookup in Swift [duplicate]在 Swift 中进行简单的 DNS 查找 [重复]
【发布时间】:2014-07-22 21:17:12
【问题描述】:

我正在尝试使用 Swift 代码进行简单的 DNS 查找。到目前为止,我有

    if  host != "\0" {
        let hostRef = CFHostCreateWithName(kCFAllocatorDefault, host.bridgeToObjectiveC()).takeRetainedValue()
        var resolved = CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil)
        let addresses = CFHostGetAddressing(hostRef, &resolved).takeRetainedValue() as NSArray

        for address: AnyObject in addresses {
            println(address)  // address is of type NSData.
        }
    }

根据Convert NSData to sockaddr struct in swift。 (hostNSString。)

但是,在执行if 语句并打印address 数据之后,在第一行以EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 退出之前,我的调试器日志打印<10020000 4a7de064 00000000 00000000>。我想要得到的只是一个带有 IP 地址的字符串,或者如果主机不存在,则为一个空字符串。

【问题讨论】:

  • 在哪一行崩溃?
  • @duci9y:对不起,第一行(代码执行后,所以技术上是if 语句的最后一行/结尾)。我会在问题中澄清这一点。
  • 我不确定你是否正确。在每一行代码上设置断点,并告诉我们最后一行成功执行的信息,以及它执行的次数。
  • @duci9y:它肯定会执行到最后并循环通过for 循环11 次。然后线程指示器转到开头的if 语句并崩溃。
  • 感谢回答我类似问题的 Martin R。看一看!我希望这对你也有帮助。 stackoverflow.com/questions/25890533/…

标签: macos dns swift nsdata nslookup


【解决方案1】:

我已经测试,发现AnyObject 是崩溃的原因。你不需要AnyObject,因为swift会从数组addresses推断类型

var host = "192.168.103.13"
    if  host != "\0" {
        let hostRef = CFHostCreateWithName(kCFAllocatorDefault, host.bridgeToObjectiveC()).takeRetainedValue()
        var resolved = CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil)
        let addresses = CFHostGetAddressing(hostRef, &resolved).takeRetainedValue() as NSArray

        println(addresses)
        //Remove `AnyObject` as there is no need.Swift will infrence from array addresses
        for address in addresses {
            println(address)  // address is of type NSData.
        }
    }

【讨论】:

  • 我正在尝试从主机名转到 IP 地址。此外,这仍然没有给我我想要的数据,这是一个带有 IP 地址的字符串。
  • 我发现这会给你类似<10020000 3b7a9621 00000000 00000000> 的东西,其中第二组 8 个符号是十六进制的 IP 地址。因此,要生成 IP 地址,您必须将每 2 个符号从十六进制转换为十进制(如 3b7a9621 = 3b.7a.96.21 = 59.122.96.33)。我希望这种情况有更好的解决方案......我也需要它.. :)
  • 我刚刚遇到了这个问题,但是使用 CFHostGetAddressing 你应该调用 takeUnretainedValue 而不是 takeRetainedValue。 stackoverflow.com/questions/34488893/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2010-09-08
  • 2011-08-07
相关资源
最近更新 更多