在局域网中,设备和设备之前相互通信是需要知道对方的ip地址的。大多数情况,设备的ip不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址。而且IP地址也不好记,那我们是不是可以通过局域网域名来访问设备呢?
可以的,要实现域名访问设备,有三种常见的方法:
mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。
简单来说,就是B设备在开启了mDNS服务的情况下,会在本机IP的5353端口注册一个服务,并登记它的域名。A电脑想访问myir.local
这个域名,那A电脑就会使用mdns协议去查询是否存在这个域名,此时同一个网段下的B设备就会主动响应这是我的域名,我的IP是XXX。然后A电脑就使用该IP来访问设备了。
这个在golang里其实非常简单,我们可以直接使用github上的一个 示范代码,简单改一下域名就行了。
https://github.com/pion/mdns/blob/master/examples/server/main.go
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT
// This example program showcases the use of the mDNS server by publishing "pion-test.local"
package main
import (
"net"
"github.com/pion/mdns/v2"
"golang.org/x/net/ipv4"
"golang.org/x/net/ipv6"
)
func runDNS() {
addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
if err != nil {
panic(err)
}
addr6, err := net.ResolveUDPAddr("udp6", mdns.DefaultAddressIPv6)
if err != nil {
panic(err)
}
l4, err := net.ListenUDP("udp4", addr4)
if err != nil {
panic(err)
}
l6, err := net.ListenUDP("udp6", addr6)
if err != nil {
panic(err)
}
_, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
LocalNames: []string{"myir.local"},
})
if err != nil {
panic(err)
}
select {}
}
这就是已经改好的代码,然后我们只需要在Go程序的main函数里,创建一个新的线程,来运行这个runDNS函数即可。
func main() {
go runDNS()
getInfo()
r := setupRouter()
// Listen and Server in 0.0.0.0:8080
r.Run(":80")
}
是不是特别简单呢,就短短的几十行代码,程序编译好,我们上传到设备上运行看看。
我们在电脑浏览器上,也可以直接使用这个域名来访问应用了。
更多回帖