Я зарегистрировал запись, используя API Bonjour. Теперь я хочу знать содержимое записи, которую я только что опубликовал. Я создал его, указав NULL имя хоста, то есть «использовать демона по умолчанию», но я не могу найти простой способ запросить то, что это такое!Как узнать имя моего многоадресного (Bonjour)?
С avahi это легко: я вызываю avahi_client_get_host_name()
, чтобы получить начальное значение имени машины.
Как для avahi, так и для Bonjour значение записи SRV может меняться в течение срока действия регистрации - если регистрация была выполнена с именем NULL, имя хоста записи обновляется автоматически, когда это необходимо. Все, что я хочу, это способ получить значение начального значения имени хоста в то время, когда я выполняю регистрацию.
Обратите внимание, что на моей тестовой машине Snow Leopard по умолчанию многоадресное имя хоста - , а не такое же, как имя машины от gethostname(2)
.
Четыре решения я могу думать:
- захватить имя хоста в моем процессе. Это может быть где-то там. Я сделал
strings(3)
поиск на дампе памяти моего процесса и нашел четыре экземпляра имени многоадресной передачи в моем адресном пространстве, но это может быть совпадением, поскольку имя используется для других целей. Даже если строка, в которой я работаю, находится где-то в моем процессе, я не могу найти API, чтобы восстановить его. - Запросить имя хоста от демона. Может быть какой-то запрос, который я могу отправить через порт mach к демону, который его извлекает? Я не могу найти API снова. Соответствующий фрагмент кода находится в файле uDNS.c в mDNSResponder и, похоже, не отображается через интерфейс RPC.
- Я мог бы просто найти сервис, который я зарегистрировал. Это может быть связано с небольшим сетевым трафиком, поэтому, если нет какой-либо гарантии, что этого не произойдет, я не хочу этого делать.
Повторно реализовать логику в uDNS.c. Она захватывает имя хоста машины из комбинации:
- конфигурации Динамический DNS
- Статически сконфигурировано имя хоста многоадресной рассылки
- обратный поиск адреса IPv4 первичного интерфейса
- Он, в частности не использует
gethostname(2)
или эквивалент
Повторная реализация этой логики кажется неосуществимой.
На данный момент я стремлюсь к поиску, чтобы получить значение начальной регистрации SRV, но это не кажется идеальным. Какое правильное решение?
Я не знаю, есть ли более эффективный метод, но я не думаю, что # 3 включает сетевой трафик, потому что локальный mDNSResponder знает ответ. Это выглядит как самый надежный метод для меня. –
Состояние гонки меня раздражает - если демона обнаруживает конфликт, он выведет запись, и поиск может вызвать трафик (хотя и маловероятно). Хотя это сносно. –