Я регистрирую услугу Bonjour, используя
DNSServiceRegister(&dnssref, 0, 0, "Fortune Server on my-PC", "_trollfortune._tcp", 0, 0, bigEndianPort, 0, 0, 0, 0);
Затем я просматриваю его, используя
DNSServiceBrowse(&dnssref, 0, 0, "_trollfortune._tcp", 0, bonjourBrowseReplyCallback, this);
мой функция обратного вызова называется дважды, с тем же serviceName
, regType
а также replyDomain
, только interfaceIndex
отличается, это первый раз 20
во второй раз 10000010
, if_indextoname()
возвращается ethernet_12
для обоих.
В то же время, Bonjour Browser (инструмент, который я нашел в Интернете) показывает, что мой сервис указан только один раз.
Я вызываю DNSServiceBrowse с неправильными параметрами?
Я нашел проблему в моем случае.
Проблема началась после установки VMware. Он создал несколько виртуальных сетевых интерфейсов. После отключения этих интерфейсов браузер показал только один результат.
Но я думаю, что проблема не связана с просмотром. Я думаю, что проблема с флагом kDNSServiceInterfaceIndexAny (0 — третий параметр) отправить в функцию DNSServiceBrowse возможно, вам нужно установить фиксированное значение интерфейса вместо 0.
Я обнаружил, что есть инструмент командной строки под названием dns-sd, который поставляется вместе с Bonjour, и вы можете регистрировать / просматривать сервисы с его помощью.
Я зарегистрировал сервис, используя
dns-sd -R "Fortune Server on my-PC" _trollfortune._tcp local 1234
и просматривая его с помощью команды
dns-sd -B _trollfortune._tcp
дает мне следующий вывод:
Browsing for _trollfortune._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
19:48:23.674 Add 3 20 local. _trollfortune._tcp. Fortune Server on my-PC
19:48:23.674 Add 2 10000010 local. _trollfortune._tcp. Fortune Server on my-PC
Поскольку стандартный инструмент, который поставляется с Bonjour, перечисляет сервис дважды, я думаю, это нормальное поведение.