【发布时间】:2021-02-15 22:24:58
【问题描述】:
我是我的 iOS 应用程序,我想解析域的 DNS 服务记录 (SRV)。
我找到了一些允许这样做的库,但响应为空。我尝试过的库之一是DNS。代码看起来像这样:
import UIKit
import DNS
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let url = "_registration._tcp.gateway.zeeotp.com"
print("Starting discovery")
do {
let request = Message(
type: .query,
authoritativeAnswer: false,
questions: [Question(name: url, type: .service)]
)
let requestData = try request.serialize()
// Decoding a message
let responseData = requestData
let response = try Message.init(deserialize: responseData)
print(response)
} catch {
print("Unexpected error: \(error).")
}
}
}
我得到的输出是:
DNS 请求(id:0,authoritativeAnswer:false,截断:false,recursionDesired:false,recursionAvailable:false,问题:[DNS.Question(名称:“_registration._tcp.gateway.zeeotp.com。”,类型: SRV,唯一:false,internetClass:A)],答案:[],权限:[],附加:[])
在我的研究过程中,我遇到了SRVResolver,但它是在 Objective-C 中的,我不知道如何让它与 Swift 一起工作。
我在 ablove 代码中是否遗漏了一些东西以使其正常工作?
【问题讨论】:
-
您的使用可能有问题,因为
internetClass: A
似乎有问题。如果class
在这里表示class
,就像在DNS 术语中一样,它应该是IN
。 -
即使我在
Question
构造函数中将internetClass 作为IN
传递,它也会被反序列化为A
类。 -
问题是这个库实际上并不执行 DNS 查询,它只是处理将 dns 查询对象转换为您可以发送到 DNS 服务器的
Data
以及接收到的@ 的转换987654333@回到一个对象。您的代码只是在解码它编码的数据 (responseData = requestData
),因此您最终没有答案,因为您实际上并没有提出问题。 -
@Paulw11Yes 是有道理的。基于此,我试图找到一种方法来使用这些数据查询公共 DNS 服务,但我能找到的只是使用 CFNetwork 类从主机解析 IP。如果您对如何查询 DNS 有任何想法并能指出我的方向,那就太好了。