关于mDNS
- 关于mDNS 推荐度:
- 相关推荐
关于mDNS
在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的 ip 地址,但是有些时候,你并不知道对方的 ip 地址,因为一般使用 DHCP 动态分配 ip 地址的局域网内,各个主机的 IP 地址是由 DHCP 服务器来帮你分配 IP 地址的。所以在很多情况下,你要知道对方的 IP 地址是比较麻烦的。
mDNS即组播DNS(multicast DNS)。使用5353端口,在内网没有DNS服务器时,就会出现此组播信息。
mDNS 的工作原理
首先,在 IP 协议里规定了一些保留地址,其中有一个是 224.0.0.251,对应的 IPv6 地址是 [FF02::FB]。
- mDNS 协议规定了一个端口,5353。
- mDNS 基于 UDP 协议。
每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。
比如,A主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:我提供 FTP 服务,我的IP是 192.168.1.101,端口是 21。当B主机进入局域网,并向 B 主机的 mDNS 服务请求,我要找局域网内 FTP 服务器,B主机的 mDNS 就会去局域网内向其他的 mDNS 询问,并且最终告诉你,有一个IP地址为 192.168.1.101,端口号是 21 的主机,也就是 A 主机提供 FTP 服务,所以 B 主机就知道了 A 主机的 IP 地址和端口号了。
大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。
在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。
这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
ESP8266 中的实现
以下的示例是用一个ESP8266在当前内网中注册一个mDNS服务,另外查询网内有哪些可以使用的mDNS,并将其全部打印出来。
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>const char* ssid = "...";
const char* password = "...";
char hostString[16] = {0};void setup() {Serial.begin(115200);delay(100);Serial.println("\r\nsetup()");sprintf(hostString, "ESP_%06X", ESP.getChipId());Serial.print("Hostname: ");Serial.println(hostString);WiFi.hostname(hostString);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(250);Serial.print(".");}Serial.println("");Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());if (!MDNS.begin(hostString)) {Serial.println("Error setting up MDNS responder!");}Serial.println("mDNS responder started");MDNS.addService("esp", "tcp", 8080); // Announce esp tcp service on port 8080Serial.println("Sending mDNS query");int n = MDNS.queryService("esp", "tcp"); // Send out query for esp tcp servicesSerial.println("mDNS query done");if (n == 0) {Serial.println("no services found");}else {Serial.print(n);Serial.println(" service(s) found");for (int i = 0; i < n; ++i) {// Print details for each service foundSerial.print(i + 1);Serial.print(": ");Serial.print(MDNS.hostname(i));Serial.print(" (");Serial.print(MDNS.IP(i));Serial.print(":");Serial.print(MDNS.port(i));Serial.println(")");}}Serial.println();Serial.println("loop() next");
}void loop() {// put your main code here, to run repeatedly:}
本文还在持续更新中,后续内容还敬请关注
- PHP服务器端API原理及示例(接口开发)
- snmp协议与snmp++
- snmp是什么?
- VMware虚拟机使用Ubuntu全屏问题
- Linux下重启MYSQL的命令
- 强力删除文件或文件夹
- 强力删除各种文件夹
- 前途迷茫不知.NET与JAVA那个好
- MongoDB勒索事件中,DBA们到底该学到什么?
- 全国计算机考试如何查准考证号
- TCPIP协议——TCP协议
- Hashtable、HashMap 与 HashTable区别、HashMap、Hashtable和TreeMap、 LinkedHashMap
- 关于PGPool
- 求绝对值最大值
- mysql upsert语法
- MFCCList使用
- pip升级报错:def read(rel
- MBRGPT硬盘分区类型属性详解(Win下更改设置OEM恢复分区方法)
- ubuntu安装pandas
- PHP使用header实现文件下载功能