winapi - 拔下网线时使用多播 DNS
问题描述
我们正在开发一个客户端应用程序,它应该能够与可以在本地主机上或本地网络中的另一台计算机上运行的服务进行通信。我们成功使用Windows 10中的DnsServiceRegister(服务器)和DnsServiceBrowse(客户端)功能,即使服务器和客户端都运行在本地主机上,只要插入网线即可。但是,当拔下网线时,DnsServiceBrowse拒绝使用 ERROR_NO_NETWORK。有没有什么方法可以在不费力的情况下解决这个限制?DnsServiceRegister 似乎在没有网线的情况下也能正常工作,所以也许还有其他方法可以从客户端查询本地 DNS 缓存?
客户端代码:
#pragma comment(lib, "dnsapi.lib")
#include <iostream>
#include <cassert>
#include <Windows.h>
#include <windns.h>
VOID WINAPI BrowseCallback(DWORD Status, PVOID pQueryContext, PDNS_RECORD pDnsRecord)
{
DnsRecordListFree(pDnsRecord);
}
int main()
{
DNS_SERVICE_BROWSE_REQUEST browseRequest{};
browseRequest.Version = DNS_QUERY_REQUEST_VERSION1;
browseRequest.InterfaceIndex = 0;
browseRequest.QueryName = L"_sam-balancelab._tcp.local";
browseRequest.pBrowseCallback = BrowseCallback;
browseRequest.pQueryContext = (PVOID)43;
DNS_SERVICE_CANCEL cancelBrowse{};
const DNS_STATUS result = DnsServiceBrowse(&browseRequest, &cancelBrowse);
// PROBLEM: DnsServiceBrowse returns ERROR_NO_NETWORK(1222) if network cable is not plugged in or network adapter is disabled by user
assert(result == DNS_REQUEST_PENDING);
std::cin.get();
return 0;
}
我不认为它是相关的,但这里是服务注册的代码:
#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,
0,
0,
0,
nullptr,
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();
}
解决方案
您是否尝试将注册表项设置Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient\EnableMulticast
为1
. 我对错误代码也有一些问题,ERROR_NO_NETWORK
对我来说这解决了它。设置后,您可能需要重新启动 Windows 服务DNS-Client
或只是重新启动。
推荐阅读
- swift - 分段错误:Xcode 升级后为 11
- opengl - 应用投影 OpenGL 时输出失真
- vue.js - Vue错误编译模板-使用v-attr时出现意外冒号
- google-chrome - 无法将 Chrome Live Edit 与 Webpack 源映射一起使用
- c# - 如何获取动态确定类型的 GetComponentsInChildren?
- java - 使用 Spring HATEOAS 添加默认链接
- angular - 其他组件中的过滤器元素
- java - java.lang.LinkageError:覆盖方法“org/w3c/dom/Node.setUserData”时加载约束冲突
- validation - Alexa AMAZON.US_FIRST_NAME 插槽验证
- python - 监视和重新启动 python 的批处理