mDNSResponder介绍与移植

article/2025/9/18 3:44:52

mDNSResponder是苹果的Bonjour项目的一部分。 Bonjour是法语“你好”的意思。
Bonjour软件源自正IETF零配置网络工作。零配置工作有三个要求:
1.分配IP地址(即使没有分配DHCP服务器的IP地址)
2.提供名称到地址的转换(即使没有DNS服务器)
3.在网络上发现相关的网络服务(同样没有其他的基础协议支持)

也就是说不需要以上DNS等相关的服务的支持,通过零配置直接完成这些任务。厉害吧?
对于1,通过自分配的本地链接地址实现。
对于2,通过多播(mDNS)发送类似DNS的查询来满足。
对于3,通过DNS Service Dicsovery(DNS-SD)满足。

自分配的本地链接地址自1998年, 在Windows '98和Mac OS 8.5中shouci出现。当然在其他平台上也支持。

mDNSResponder

mDNSResponder项目实现了上面的2和3。其中,m是Multicast缩写。即使用户没有设置传统的DNS服务器,用户也能够使用服务名称(比如www.sohu.com),而不是点分十进制IP地址(suhu的IP是122.13.86.100)来标识主机。它还为用户无需事先了解服务的细节,就可以发现网络上正在播发什么服务,也无需配置机器。

选择名称“ mDNS”,是因为该协议类似于常规DNS。不过,mDNS和DNS的主要区别在于:
mDNS查询是通过多播发送到所有本地主机,而不是通过单播发送到特定的已知服务器。本地链接上的每个主机都运行一个mDNSResponder,该DNS响应器不断监听那些多播查询,如果mDNSResponder接收到自己关注的查询,则做出响应。

mDNS协议使用与单播DNS相同的数据包格式,相同的名称结构和相同的DNS记录类型。这部分的主要区别在于:
1.查询被发送到不同的UDP端口(5353,而不是53),并通过多播发送到地址224.0.0.251。
2.所有“ mDNS”名称都以“ .local”结尾。当用户键入“ yourcomputer.local”时。进入他们的Web浏览器时,就会显示“ .local”。.local告诉主机OS应该使用本地多播查找该名称,而不是通过将该名称发送给互联网的DNS服务。这有助于用户区分特定名称是广域网的(例如“ www.apple.com”)还是仅仅在本地(例如“ yourcomputer.local”)。

mDNSResponder源代码

由于Apple认为公开这部分代码比较好,可以供其他开发人员使用。这部分代码可以兼容不同种类的OS。
典型的mDNS程序包含三个组件:
在这里插入图片描述
“ mDNS Core”层在所有应用程序和所有操作系统都是相同的。
“Platform Support”层提供了特定于每个平台的必要支持例程,例如,调用哪个例程以发送UDP数据包,调用哪个例程以加入多播组等等。
“Application”层可以执行特定应用程序想要执行的任何操作。 它调用“ mDNS Core”层提供的例程来执行所需的功能:
*发布服务,
*浏览特定服务类型的命名实例
*将命名实例解析为特定的IP地址和端口号,

移植

Apple当前为Mac OS 9,Mac OS X,Microsoft Windows,VxWorks以及POSIX平台(例如Linux,Solaris,FreeBSD等)提供“平台支持”层。
注意,OS X已经提供了mDNS 对应的系统调用,因此不需要移植这份代码。

如果每个应用程序将mDNSResponder代码链接到应用内部中,那么最终将遇到如下图所示的情况:
在这里插入图片描述

这样效率不高。其实OS X提供了一种通用的系统服务,可以通过“ /usr/include/dns_sd.h”API对其进行访问就ok了。所以实际上每个应用都访问daemon程序,只用一份就好了:
在这里插入图片描述
如果希望在内部使用,不用第三方的服务,可以参照上图来移植。在 mDNSPosix目录有具体的说明。

在旧版本的编译器移植

有的编译器太旧,不支持双斜杠的注释://,那么就要手动改了。比如:
打开BBEdit:

  1. 打开 “Find” 对话选择 “Use Grep”
  2. 搜索 : ([^:])//(.*)
  3. 替换: \1/*\2 */
  4. 将mDNSResponder代码拖到多文件搜索界面
  5. 选择"Replace All" 替换所有。

对于面向更多命令行,可以进入代码目录,执行下面的命令:

find mDNSResponder ( -name *.c* -or -name *.h ) -exec sed -i .orig -e ‘s,^//(.),/\1 /,’ -e '//*/!s,([^:])//(.),\1/*\2 */,’ {} ;

mDNSPosix

mDNSPosix是Apple的mDNS到Posix平台的移植。

目录:

mDNSCore-包含核心mDNS代码的目录。该代码是用纯ANSI C编写的,并被证明具有很高的可移植性。每个平台都需要此核心协议引擎代码。

mDNSShared-一个包含有用代码的目录,该代码不是主协议引擎本身的核心。

mDNSPosix-特定于Posix平台的文件:Linux,Solaris,FreeBSD,NetBSD,OpenBSD等。

Clients -客户端代码示例,显示如何将API用于守护程序提供的服务。

编译代码

在mDNSPosix目录,make对应的系统名称:
make os=linux
之后在mDNSPosix/build/prod目录会生成下面的文件:

.
├── libdns_sd.so
├── libnss_mdns-0.2.so
├── mDNSClientPosix
├── mdnsd
├── mDNSIdentify
├── mDNSNetMonitor
├── mDNSProxyResponderPosix
└── mDNSResponderPosix

通用平台使用(例如在台式计算机上):
-mdnsd
-libmdns
-nss_mdns(有关nss_mdns,请参见nss_ReadMe.txt)
专用平台使用:
-mDNSClientPosix
-mDNSResponderPosix
-mDNSProxyResponderPosix
测试工具:
-dns-sd命令行工具(来自“Client”文件夹)
-mDNSNetMonitor
-mDNSIdentify

运行说明

在这里插入图片描述
mdnsd分为三个部分。

o mDNSCore是主要的协议引擎
o mDNSPosix.c提供了在Posix OS上的对应移植
o uds_daemon.c将Unix域套接字接口,导出到mDNSCore提供的服务

客户端应用程序与libmdns链接,libmdns实现dns_sd.h头文件中定义的功能,并实现IPC协议,该协议用于通过Unix Domain Socket接口与守护程序进行通信。

严格来说,nss_mdns只是mdnsd的另一个客户端,就像其他任何客户端一样与libmdns链接。只不过它在多播DNS的正常运行中起着核心作用,因此它与其他必要的系统支持组件一起编译安装。

小型嵌入式系统客户端

有时候需要在极小的系统下支持mdns,但是系统资源有限,这时候可以取消uds_daemon和libmdns层。直接调用core的接口。下面是一些简要的说明,如果没有这样的需求就直接跳过不用看了。
在这里插入图片描述
不过,这样工作量会比较大。
1.应用程序调用mDNS_Init,后者调用平台(mDNSPlatformInit)。

  1. mDNSPlatformInit获取接口列表(get_ifi_info),并向核心注册每个接口(mDNS_RegisterInterface)。它还为每个接口创建一个多播套接字(SetupSocket)。

3.然后,应用程序反复调用select()来处理文件描述符事件。在每次调用select()之前,应用程序都会调用mDNSPosixGetFDSet()来给mDNSPosix.ca机会将其自己的文件描述符添加到集合中,然后在select()返回之后, 调用mDNSPosixProcessFDSet()来使 接收并处理数据包。

4.当核心需要发送UDP数据包时, 调用mDNSPlatformSendUDP。该例程查找与内核请求的源地址相对应的接口,并使用为该接口创建的UDP套接字发送数据报。如果套接字是流发送侧控制的,则丢弃数据包。

5.当SocketDataReady运行时,它使用复杂的例程“ recvfrom_flags”来接收数据包。

另外,如果决定在平台中使用线程,注意要实现mDNSPlatformLock()和mDNSPlatformUnlock()调用。


http://chatgpt.dhexx.cn/article/1J94HLsC.shtml

相关文章

启用Ubuntu 服务器上的 mDNS

陈拓 2022/03/18-2022/03/18 在动态分配IP地址的情况下,在局域网中使用mDNS访问Ubuntu服务器就不需要知道IP地址了。 我的Ubuntu系统版本 先用IP地址登录Ubuntu服务器。 具体操作见《Win10命令窗口的SSH和SFTP操作》 Win10命令窗口的SSH和SFTP操作_晨之清风的博…

Bonjour手把手搭建一:mDNS(apple multicastdns.org)

mDNS(Multicast DNS)——From Apple https://support.apple.com/kb/TA20999?localezh_CN&viewlocaleen_US Multicast DNS, one of the features incorporated in Bonjour, which was introduced in Mac OS X 10.2. Bonjour的一个新特性,在Mac OS X10.2后引入…

SpyCast:一款功能强大的跨平台mDNS枚举工具

关于SpyCast SpyCast是一款功能强大的跨平台mDNS枚举工具,该工具支持在主动模式下下递归查询服务,也可以在被动模式下仅侦听多播数据包。因此,广大研究人员可以使用该工具测试mDNS协议和本地网络的安全性。 mDNS介绍 mDNS,即多…

esp-idf编译报错Failed to resolve component ‘mdns‘

Failed to resolve component mdns 根据提示 打开https://components.espressif.com/搜索mdns 选择复制 执行后再次进行编译

OpenWrt 安装 mDNS,并设置 mDNS 映射

OpenWrt 安装 mDNS,并设置 mDNS 映射 路由器:OpenWrt 21.02.1电脑:Windows 10 21H1 Windows 10 现在已经默认支持了 mdns,可以直接 ping 设备名称.local 查看电脑的ip。 1.下载 mDNS 安装包 opkg update opkg install umdns…

ESP mDNS 学习

文章目录 1 概述2 linux avahi3 ESP32 mDNSmDNS 数据包4 参考资料 1 概述 mDNS 是一种多播 UDP 服务,用来提供本地网络服务和主机发现,mDNS 协议发布为 rfc6762。 在没有任何传统单播 DNS 服务器的情况下,多播 DNS (mDNS) 提供了在本地连接…

mDNS/DNS-SD java及Avahi 实现服务发布和服务发现

一、jmDNS&#xff1a;JAVA实现&#xff08;JmDNS&#xff09; 引入pom <!-- https://mvnrepository.com/artifact/javax.jmdns/jmdns --> <dependency><groupId>javax.jmdns</groupId><artifactId>jmdns</artifactId><version>3.4.…

mDNS安装与开启

在局域网建立.local域名 参考来源 1 苹果设备自带 Bonjour无需安装 2 windows需要安装 bonjour 装了也没用 安卓也没找到可用的 目前就苹果和乌班图可互通 3 linux设备 ubuntu 安装avahi sudo apt-get install avahi-daemon sudo apt-get install avahi-uti…

安卓基于MDNS协议的局域网内服务发现

mDNS简介 mdns 即多播(组播)dns&#xff08;Multicast DNS),用于本地局域网服务发现的协议&#xff0c;在Apple 的设备上&#xff08;电脑&#xff0c;笔记本&#xff0c;iphone&#xff0c;ipad等设备&#xff09;都提供了这个服务&#xff08;Bonjour&#xff09;。 mDNS有…

mDNS协议

1&#xff0c;这个项目主要使用go的原生net包和github.com/miekg/dns这个dns工具包来实现mdns的。我们需要实现mdns的服务端和客户端的代码&#xff0c;可以从开源项目里找过来用的。 数据包主要用到了网络层的icmp差错控制协议来返回响应数据包的&#xff0c;它里面携带了一个…

网络协议学习-mDNS

前面在学习局域网设备发现的时候&#xff0c;学习了UPnP协议&#xff0c;学习到了里面的设备发现协议SSDP&#xff0c;SSDP设备发现。 最近又发现了一种常见的协议&#xff0c;用来发现局域网内的设备及服务&#xff0c;就是mDNS协议&#xff0c;这是一种零配置服务。 mDNS即多…

mysql数据库备份 dump,使用mysqldump对数据库备份和恢复

数据库存储引擎&#xff1a;InnoDB 启用binlong 一、恢复误删除的数据库到最新状态 1、备份数据库 mysqldump -A -F -uroot -p --master-data2 --single-transaction > /backups/all-date %F_%T.sql 2、对数据库误删除 MariaDB [reset_gq]> drop database reset_gq; 3、对…

MySQL全量备份和增量备份

MySQL目前是市面上比较流程的关系型数据库&#xff0c;很多人使用MySQL里的数据真的安全吗&#xff1f;如果发生以下问题的话&#xff1a; MySQL数据目录所在磁盘损坏MySQL服务器发生故障人为操作失误导致删除了一些数据黑客入侵导致数据被攻陷等问题 这个时候如果没有备份数…

mysql备份test数据库_mysql和test数据库

安装mysql yum -y install mysql mysql-server mysql-devel service mysqld startmysqladmin -uroot -p password "123456"mysql -uroot -pshow databases; use mysql; sho... 文章 weibinwps 2017-12-25 983浏览量 mysql导入和导出数据 Linux下如何单个库进行导入和…

app服务器 数据库文件,app访问服务器mysql数据库文件

app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制&#xff0c;用来提高实例的稳定性和安全性&#xff0c;具体详见表1。 对于mysqlpump工具&#xff0c;由于在并行备份场景有coredump问题&#xff0c;不建议您使用&#xff0c;推…

定时备份MYSQL数据库

首先查看磁盘情况&#xff0c;选择空间充足的磁盘空间&#xff0c;避免出现因空间不足导致备份失败 df -h 这里选择磁盘较大的&#xff0c;app 创建备份目录 cd /app mkdir bkdatabase cd bkdatabase 创建备份的shell脚本 vim backmysql.sh 添加内容&#xff1a; #!/bi…

MYSQL数据库(八)数据库备份和恢复

成功不易&#xff0c;加倍努力&#xff01; 5 备份和恢复5.1 备份恢复概述5.1.1 为什么要备份5.1.2 备份类型5.1.3 备份什么5.1.4 备份注意要点5.1.5 还原要点5.1.6 备份工具5.1.6 基于 LVM 的快照备份5.1.7 实战案例&#xff1a;数据库冷备份和还原 5.2 mysqldump备份工具5.2.…

【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

关注「WeiyiGeek」公众号 将我设为「特别关注」&#xff0c;每天带你玩转网络安全运维、应用开发、物联网IOT学习&#xff01; 测试环境: Server 2008 R2 所需软件: - MySQLdump.exe - msvcp120.dll x64/x86- msvcr120.dll x64/x86- powershell- 7z 设置PowerShell策略: PS…

数据库备份脚本大全

备份脚本六个注意点 在写脚本前我这里按照个人习惯大概总结了以下六点&#xff0c;感兴趣的可以继续看看&#xff0c;不感兴趣的直接跳过就好。 1、首先要注意的一点就是 shell 环境是 bash 还是 sh ,需要在你的脚本开头中注明。 #!/bin/bash 2、其次就是数据库环境变量需要申明…

C#实现MySQL数据库数据的备份与恢复

这几天一直在做学校的C#期末项目&#xff0c;其中有一个功能就是数据的备份与恢复&#xff0c;在百度了一番之后&#xff0c;只找到了适用于SQL Server的备份SQL语句 BACKUP DATABASE database_name TO DISK physical_device_name [ WITH { DIFFERENTIAL | COPY_ONLY | {…