Как выполнить поиск записи 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

Первый абзац отвечает, как получить обратный вызов без блокировки.

Другие вопросы по тегам