Windows上的标准mDNS服务

32

Windows(某些现代版本)是否默认安装并/或运行mDNS服务器?如果是,则如何告诉它,最好是动态地,开始/停止广告一个新服务?

如果没有标准,那么如何处理在该环境中尝试运行多个mDNS服务器时发生的冲突问题?

基本上,我想实现一个可在Linux、Windows和Mac OS X上运行的服务,并且需要使用mDNS来广告其零配置Web服务器位置。 在Linux上,我只使用avahi-publish(或安装配置文件)。 我猜答案对于OS X来说会很简单。 我正在努力查找有关Windows的信息。

6个回答

46

从Windows 10开始,微软开始努力实现原生的mDNS和DNS-SD。

先前版本只能用于UWP应用程序,但至少在SDK版本10.0.18362.0 (1903/19H1, 2019年5月)中,已经公开了一种通用Win32 API

注意:目前证实该实现仅适用于64位构建目标,存在一个未解决的问题,导致无法编译32位目标。

来自此答案先前版本的过时说明:

早期版本导致mDNS网络洪泛:

默认情况下,Windows 10会通过响应所有的mDNS请求并发送空响应数据包来向本地网络发送垃圾信息。

这个问题已在Windows 10 1511 (10586)及以上版本中得到解决。


“which is currently limited to UWP apps” => 看起来不再是真的了。您链接的页面现在说:“Win32 DNS 服务发现 (DNS-SD) API 声明在 windns.h 头文件中。例如,用于宣布和发现服务的 Win32 API 是 DnsServiceRegister 和 DnsServiceBrowse。” - Simon Kissane
谢谢你提醒。不幸的是,文档没有说明这个限制从什么时候开始被解除。我会调整答案以反映新的情况。 - Jens Habegger
根据 GitHub 上的一个随机但富有信息量的 PR,API 在 SDK 版本 10.0.18362.0 (1903/19H1) 中已经对 Win32 开放。(可能,Win32 API 一直存在,但仅在该 SDK 版本中开始记录和公开头文件。)此外,同一份 PR 还提到,显然这个 API 在 32 位上有问题,但在 64 位上可以正常工作。 - Simon Kissane
感谢您的研究,我已更新答案以反映最新的发展。 - Jens Habegger
不再是“开放问题” - Andrew Savinykh

12

上一次我需要时,苹果公司的Bonjour打印服务(适用于Windows)是我能找到的最便利的Windows mDNS客户端。仅5MB。

注:mDNS是指多播域名系统,Bonjour是Apple公司开发的一种实现mDNS协议的服务。

3
我无法在最新版本的Windows 10上让这个工作。我怀疑原因是Windows本身(一个叫做DNSCache的进程)现在正在监听5353端口。 - Kevin Keane

6
不,微软不直接支持多播DNS。
然而,似乎有几个第三方替代方案:

5
我现在也成功地使用C++/WinRT直接从C++进行了dnssd发现。 从我们的角度来看,它似乎更快,更可靠,可以查询服务,并让您轻松安装观察器以在设备到达时获得通知等。 当然,这仅限于支持C++/WinRT的Windows 10版本,从10.0.17134.0(Windows 10版本1803)开始。
一个注意事项:我们注意到它不提供,也不识别FQDN(尾随点)。 因此,对于Bonjour或Avahi会给出mydevice.local.地址的设备,在Windows下会给出mydevice.local。 在Windows 10(1809)下尝试ping mydevice.local.将失败。

我对你的解决方案非常感兴趣,因为我们正好遇到了同样的问题...你能分享一些代码/示例吗?那将非常有帮助!谢谢。 - user3256556

3

“仅适用于现代API,不适用于Win32应用程序” => 看起来不再正确。请参阅windns.h中的DnsServiceRegister和DnsServiceBrowse API。 - Simon Kissane
@SimonKissane你能提供一个链接吗?因为你提到了一个错误并(我猜)也给了负评? - FarO
不,我没有给你的帖子投反对票。一定是其他人这么做了。有关详细信息,请参见上面Jens Habegger的回答,该回答已更新。 - Simon Kissane
@SimonKissane 我正在尝试使用这些函数,但它们的注册在 UPnP 扫描工具中没有显示。 - Michael Chourdakis
@MichaelChourdakis 我曾经计划在一个项目中使用它们,因此正在研究它们以确定其可行性,但是(至少目前)该项目没有继续进行,所以我实际上从未尝试过使用它们。鉴于此,很抱歉,我无法帮助您解决任何使用问题。(也许将您的问题转化为一个问题,或许其他人会回答?) - Simon Kissane

-3
简短的回答是支持Avahi和Bonjour。无论如何,您都需要Bonjour支持才能在OSX上运行,如果Windows用户已安装iTunes,则他们已经在运行它。
作为Windows用户的备选方案,如果他们没有运行iTunes,您可以将Avahi编译为Windows库(需要一些努力)并捆绑它。这是一个不容易的打包过程,但另一种选择是要求您的Windows用户安装iTunes才能使用您的应用程序。

5
Avahi和Bonjour是相同协议的不同许可证实现。https://en.wikipedia.org/wiki/Avahi_(software)#Avahi_vs._Bonjour - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接