You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:39:21