Android NSD无法解析Windows上的mDNS服务问题求助
Android NSD无法解析Windows mDNS服务问题
我需要让Android设备发现并解析Windows上的服务。Android端作为客户端使用NSD服务,已知Windows 10开始支持mDNS/DNS-SD,因此我使用DnsServiceRegister API在Windows上注册mDNS服务。目前Android应用可以发现该服务,但无法成功解析。
通过Wireshark抓取局域网数据包发现,Android NSD服务持续向Windows发送mDNS报文查询主机地址,但Windows未回复主机地址信息。
Windows端服务注册代码
#include <iostream> #include <stdio.h> #include <wtypes.h> #include <minwinbase.h> #include <winnt.h> #include <windns.h> #include <winerror.h> VOID WINAPI register_cb(DWORD status, PVOID pQueryContext, PDNS_SERVICE_INSTANCE pInstance) { cout << "register_cb:" << status << endl; } int main(void) { IP4_ADDRESS ipv4_address = { 0 }; ipv4_address = inet_addr("192.168.50.27"); PDNS_SERVICE_INSTANCE instance = DnsServiceConstructInstance( L"windows-mxj._http._tcp.local", L"mxj.local", &ipv4_address, NULL, 90006, 0, 0, 0, NULL, NULL); DNS_SERVICE_REGISTER_REQUEST req = {0}; req.Version = DNS_QUERY_REQUEST_VERSION1; req.InterfaceIndex = 0; req.pServiceInstance = instance; req.pRegisterCompletionCallback = register_cb; req.pQueryContext = instance; DNS_STATUS regstatus = DnsServiceRegister(&req, nullptr); if (regstatus == DNS_REQUEST_PENDING) { std::cout << "register success" << endl; } else { std::cout << "register fail,ret:" << regstatus << endl; std::cout << "LastErr:" << GetLastError() << endl; } }
尝试添加主机A记录的失败情况
我推测问题出在缺少主机地址DNS记录,于是尝试在register_cb回调中使用DnsModifyRecordsInSet_A API添加主机A记录,但该API返回错误码9002(DNS_ERROR_RCODE_SERVER_FAILURE)。
错误码定义:
// DNS_ERROR_RCODE_SERVER_FAILURE 0x0000232a // // MessageId: DNS_ERROR_RCODE_SERVER_FAILURE // // MessageText: // // DNS server failure. // #define DNS_ERROR_RCODE_SERVER_FAILURE 9002L
添加A记录的代码片段:
recordA.pNext = NULL; recordA.pName = instance->pszHostName; recordA.wType = DNS_TYPE_A; recordA.wDataLength = sizeof(DNS_A_DATA); recordA.Flags.S.Section = DnsSectionAddtional; recordA.Flags.S.CharSet = DnsCharSetAnsi; recordA.dwTtl = 60; recordA.Data.A.IpAddress = inet_addr("192.168.50.27"); DNS_STATUS ret = DnsModifyRecordsInSet_A(&recordA, NULL, DNS_UPDATE_SECURITY_OFF, NULL, NULL, NULL); cout << "ModifyRecords :" << ret << " " << recordA.Data.A.IpAddress << endl;
内容的提问来源于stack exchange,提问作者Xiaojie Ma
相关产品推荐
相关产品推荐

