У меня есть приложение, построенное с использованием MFC, которое мне нужно добавить для обнаружения службы Bonjour/Zeroconf. Мне было сложно понять, как это сделать, но я решил использовать DLL-заглушку, предоставленную в исходном коде mDNSresponder, и привязать мое приложение к статическому lib, сгенерированному этим (что, в свою очередь, использует систему dnssd.dll).DNS-SD в Windows с использованием MFC
Однако у меня по-прежнему возникают проблемы, поскольку обратные вызовы не всегда вызываются так, что я обнаружил открытые устройства. Что меня смущает, так это то, что все работает отлично в OSX, используя службу терминалов OSX dns-sd и под Windows, используя службу командной строки dns-sd. Исходя из этого, я исключаю обслуживание клиентов как проблему и пытаюсь выяснить, что не так с моим кодом Windows.
Я в основном вызываю DNSBrowseService(), а затем в этом обратном вызове вызывает DNSServiceResolve(), а затем, наконец, вызывает DNSServiceGetAddrInfo(), чтобы получить IP-адрес устройства, чтобы я мог подключиться к нему.
Все эти вызовы основаны на использовании WSAAsyncSelect так:
DNSServiceErrorType err = DNSServiceResolve(&client,kDNSServiceFlagsWakeOnResolve,
interfaceIndex,
serviceName,
regtype,
replyDomain,
ResolveInstance,
context);
if(err == 0)
{
err = WSAAsyncSelect((SOCKET) DNSServiceRefSockFD(client), p->m_hWnd, MESSAGE_HANDLE_MDNS_EVENT, FD_READ|FD_CLOSE);
}
Но иногда обратного вызова просто никогда не вызывается, даже если услуга там и с помощью командной строки подтвердит.
Я полностью в тупике, почему это не на 100% надежнее, но это если я использую одну и ту же DLL из командной строки. Мое единственное возможное объяснение заключается в том, что функция DNSServiceResolve пытается вызвать функцию обратного вызова до того, как WSAAsyncSelect зарегистрировал сообщение обработки для сокета, но я не вижу никакого способа обойти это.
Я потратил на это время, и теперь я полностью исключаю идеи. Любые предложения приветствуются, даже если они «это действительно тупой способ сделать это, почему вы не делаете X, Y, Z».