Как выполнить поиск записи CNAME в swift
В Интернете я нашел пример кода, который я пытаюсь использовать для поиска записи CNAME (обратите внимание, что я передаю callback
блок, который я хочу запустить):
DNSServiceQueryRecord(serviceRef, 0, 0, domainName, UInt16(kDNSServiceType_CNAME), UInt16(kDNSServiceClass_IN), callback, &mutableCompletionHandler);
DNSServiceProcessResult(serviceRef.pointee)
Проблема в том, что этот код блокируется на DNSServiceProcessResult(serviceRef.pointee)
и callback
никогда не называется. В соответствии с документацией Apple для DNSServiceProcessResult, мне нужно
использование
DNSServiceRefSockFD
в сочетании с циклом выполнения или select(), чтобы определить наличие ответа от сервера, прежде чем вызывать эту функцию для обработки ответа без блокировки.
Итак, я посмотрел на DNSServiceRefSockFD
и обнаружил, что я мог бы создать dnssd_sock_t
с DNSServiceRefSockFD(serviceRef.pointee)
, Но теперь, когда у меня есть сокет, я не уверен, как "использовать его вместе с циклом выполнения" в качестве источника события для цикла выполнения (согласно документации DNSServiceRefSockFD).
Я просто не понимаю, как это работает. Я не понимаю, как использовать dnsssd_sock_t
в качестве источника события для цикла выполнения, чтобы я мог вызвать DNSServiceProcessResult
в нужное время без блокировки, так что мой callback
на самом деле будет работать.
Если лучше использовать сокет в качестве источника события kqueue или в цикле select() (как упоминается в документации), я согласен с этим, но я также не знаю, как это сделать.
CoreFoundation может быть довольно загадочным, поэтому любая помощь очень ценится!
И если есть лучший способ поиска записей CNAME, то, пожалуйста, поделитесь!
1 ответ
Смотрите мои (ethan-gerardot) комментарии на https://gist.github.com/fikeminkel/a9c4bc4d0348527e8df3690e242038d3
Первый абзац отвечает, как получить обратный вызов без блокировки.