【问题标题】:Reverse DNS lookup inside a network extension在网络扩展内反向 DNS 查找
【发布时间】:2020-05-11 07:21:43
【问题描述】:

我正在 macOS 上使用 NetworkExtension 框架编写内容过滤器。 (NEFilterDataProvider)。

在这段代码中,我可以看到使用的 IP 地址。如何有效地从这些 IP 获取域名? 理想情况下,有一种方法可以使用 swift(或 Objective-c 框架)来完成,这样我就可以轻松完成。如果没有,如何访问 macOS 上的 dns 缓存?

【问题讨论】:

    标签: objective-c swift network-programming macos-catalina


    【解决方案1】:

    Apple 对此available heresome sample code 有非常详细的文档。

    基本步骤是:

    使用 CFHost 解析主机:

    1. 通过调用 CFHostCreateWithAddress 创建一个 CFHostRef 对象。
    2. 调用 CFHostSetClient 并提供您选择的上下文对象以及解析完成时将调用的回调函数。
    3. 调用 CFHostScheduleWithRunLoop 以在运行循环中安排解析器。
    4. 调用 CFHostStartInfoResolution 告诉解析器开始解析,传递 kCFHostNames 作为第二个参数来表明您希望它返回主机名。
    5. 等待解析器调用您的回调。在您的回调中,通过调用 CFHostGetNames 获取结果。此函数返回一个 CFDataRef 对象数组,每个对象都包含一个 POSIX sockaddr 结构。

    开始这个过程的主要部分是这样的,来自 Apple 的示例代码。 self.host 是您从地址创建的 CFHost:

    func start() {
        precondition(self.targetRunLoop == nil)
        self.targetRunLoop = RunLoop.current
        
        var context = CFHostClientContext()
        context.info = Unmanaged.passRetained(self).toOpaque()
        var success = CFHostSetClient(self.host, { (_ host: CFHost, _: CFHostInfoType, _ streamErrorPtr: UnsafePointer<CFStreamError>?, _ info: UnsafeMutableRawPointer?) in 
            let obj = Unmanaged<HostNameQuery>.fromOpaque(info!).takeUnretainedValue()
            if let streamError = streamErrorPtr?.pointee, (streamError.domain != 0 || streamError.error != 0) {
                obj.stop(streamError: streamError, notify: true)
            } else {
                obj.stop(streamError: nil, notify: true)
            }
        }, &context)
        assert(success)
        CFHostScheduleWithRunLoop(self.host, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)
        
        var streamError = CFStreamError()
        success = CFHostStartInfoResolution(self.host, .names, &streamError)
        if !success {
            self.stop(streamError: streamError, notify: true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2021-07-08
      • 2016-09-24
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多