拔下网线时使用多播 DNS

问题描述

我们正在开发一个客户端应用程序,它应该能够与可以在本地主机或本地网络中的不同计算机上运行的服务进行通信。我们成功使用Windows 10中的DnsServiceRegister(服务器)和DnsServicebrowse(客户端)功能,即使服务器和客户端都运行在本地主机上,只要插上网线。 然而,当网线被拔掉时,DnsServicebrowse拒绝使用 ERROR_NO_NETWORK。有没有什么办法可以在不费力的情况下解决这个限制? DnsServiceRegister 在没有网线的情况下似乎也能正常工作,那么也许还有其他方法可以从客户端查询本地 DNS 缓存?

客户端代码

#pragma comment(lib,"dnsapi.lib")

#include <Windows.h>
#include <iostream>
#include <cassert>
#include <windns.h>

VOID WINAPI DnsServiceRegisterComplete(DWORD Status,PVOID pQueryContext,PDNS_SERVICE_INSTANCE pInstance)
{
    std::cout << "DnsServiceRegisterComplete" << (int)pQueryContext << std::endl;
}

int main()
{
    const PDNS_SERVICE_INSTANCE serviceInstance = DnsServiceConstructInstance(
        L"SAM BalanceLab._sam-balancelab._tcp.local",L"Ryzen3950X.local",// for some reason,no matter what we specify here,// Windows only delivers nullptr for IP addresses to callers of DnsServiceResolve
        nullptr,nullptr,12344,nullptr);
    assert(serviceInstance != nullptr);

    DNS_SERVICE_REGISTER_REQUEST request{};
    request.Version = DNS_QUERY_REQUEST_VERSION1;
    request.InterfaceIndex = 0;
    request.pServiceInstance = serviceInstance;
    request.pRegisterCompletionCallback = &DnsServiceRegisterComplete;
    request.pQueryContext = (void*)42;
    request.hCredentials = nullptr;
    request.unicastEnabled = FALSE;
    DWORD result = DnsServiceRegister(&request,nullptr);
    assert(result == DNS_REQUEST_PENDING);
    std::cin.get();
}

我不认为它是相关的,但这里是注册服务的代码

{{1}}

解决方法

您是否尝试将注册表项 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient\EnableMulticast 设置为 1。我也遇到了错误代码 ERROR_NO_NETWORK 的一些问题,对我来说这解决了它。设置后,您可能需要重新启动 Windows 服务 DNS-Client 或重新启动。