mDNS(多播DNS)是一种用于在本地网络上发现其他设备和服务的协议
- 安装必要的软件包:
在Ubuntu上,你需要安装avahi-daemon
和libnss-mdns
这两个软件包。打开终端并运行以下命令来安装它们:
sudo apt-get update sudo apt-get install avahi-daemon libnss-mdns
- 配置mDNS:
编辑/etc/nsswitch.conf
文件,将hosts
行修改为包含mdns4_minimal
:
sudo nano /etc/nsswitch.conf
将以下内容添加到hosts
行:
hosts: files mdns4_minimal [NOTFOUND=return] dns
保存并退出。
- 重启
avahi-daemon
服务:
sudo systemctl restart avahi-daemon
- 注册服务:
你可以使用avahi-publish
命令注册一个服务。例如,如果你想在本地网络上注册一个名为myservice
的服务,可以运行以下命令:
avahi-publish -s "My Service" _myservice._tcp 12345
这将在本地网络上注册一个名为My Service
的服务,使用TCP协议,端口号为12345。
- 发现服务:
要在本地网络上发现服务,可以使用avahi-browse
命令。例如,要查找所有可用的_tcp
服务,可以运行以下命令:
avahi-browse -at _services._dns-sd._udp
这将显示本地网络上所有可用的服务。
- 使用Python编写mDNS客户端和服务器:
你还可以使用Python的zeroconf
库编写mDNS客户端和服务器。首先,安装zeroconf
库:
pip install zeroconf
然后,你可以参考以下示例代码来实现mDNS客户端和服务器:
- mDNS服务器示例代码:
from zeroconf import ServiceInfo, Zeroconf desc = {'version': '0.1'} info = ServiceInfo("_myservice._tcp.local.", "My Service._myservice._tcp.local.", socket.inet_aton("127.0.0.1"), 12345, 0, 0, desc) zeroconf = Zeroconf() zeroconf.register_service(info) try: while True: time.sleep(0.1) except KeyboardInterrupt: pass finally: zeroconf.unregister_service(info) zeroconf.close()
- mDNS客户端示例代码:
from zeroconf import ServiceBrowser, Zeroconf class MyListener: def remove_service(self, zeroconf, type, name): print("Service %s removed" % (name,)) def add_service(self, zeroconf, type, name): info = zeroconf.get_service_info(type, name) print("Service %s added, service info: %s" % (name, info)) zeroconf = Zeroconf() listener = MyListener() browser = ServiceBrowser(zeroconf, "_myservice._tcp.local.", listener) try: while True: time.sleep(0.1) except KeyboardInterrupt: pass finally: zeroconf.close()
这样,你就可以在Ubuntu上使用mDNS进行设备间通信了。