Bonjour/Zeroconf サービス検出を追加する必要がある MFC を使用して構築されたアプリケーションがあります。最善の方法を見つけるのに少し苦労しましたが、mDNSresponder ソース コードで提供されている DLL スタブを使用し、それによって生成された静的ライブラリにアプリケーションをリンクすることにしました (これは、システムを使用します)。 dnssd.dll)。
ただし、コールバックが常に呼び出されているとは限らないため、デバイスの検出が停止するため、まだ問題があります。私を混乱させているのは、OSX dns-sd ターミナル サービスを使用する OSX と dns-sd コマンド ライン サービスを使用する Windows では、すべて問題なく動作することです。その上で、クライアント サービスが問題であることを除外し、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 を使用した場合です。考えられる唯一の説明は、WSAAsyncSelect がソケットの処理メッセージを登録する前に、DNSServiceResolve 関数がコールバック関数を呼び出そうとすることですが、これを回避する方法がわかりません。
私はこれに何年も費やしてきましたが、今では完全にアイデアがありません。「それは本当にばかげた方法です。なぜX、Y、Zをやらないのですか」という提案であっても、どんな提案でも大歓迎です。