我们正在开发一个客户端应用程序,它应该能够与可以在本地主机上或本地网络中的另一台计算机上运行的服务进行通信。我们成功使用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();
}