2023-04-29 libp2p学习——mdns
mdns.NewMdnsService(peerhost, rendezvous, n)
mdns.NewMdnsService 是一个函数,用于创建一个基于 mDNS 协议的服务,它可以帮助节点在局域网中发现对等节点。该函数的签名如下:
func NewMdnsService(ctx context.Context, peerhost host.Host, rendezvous string, interval time.Duration, opts ...Option) (discovery.Service, error)
NewMdnsService 函数接受五个参数:
-
ctx:一个context.Context对象,用于控制服务的生命周期。 -
peerhost:一个host.Host对象,表示服务所在的节点。 -
rendezvous:一个字符串,表示节点要加入的 mDNS 群组的名称。 -
interval:一个时间间隔,表示节点在群组中宣布自己的服务信息的时间间隔。 -
opts:一个可选参数列表,用于指定其他选项,例如 TTL 和端口号等。
以下是 mdns.NewMdnsService 的一个例子:
package main
import (
"context"
"fmt"
"time"
"github.com/libp2p/go-libp2p"
"github.com/libp2p/go-libp2p-core/discovery"
"github.com/libp2p/go-libp2p-core/host"
"github.com/libp2p/go-libp2p-mdns"
)
func main() {
ctx := context.Background()
host, err := libp2p.New(ctx)
if err != nil {
fmt.Println("Error creating libp2p host:", err)
return
}
service, err := mdns.NewMdnsService(ctx, host, "my-rendezvous", time.Second*10)
if err != nil {
fmt.Println("Error creating mdns service:", err)
return
}
peerChan, err := service.FindPeers(ctx, "my-rendezvous")
if err != nil {
fmt.Println("Error finding peers:", err)
return
}
for peer := range peerChan {
fmt.Println("Found peer:", peer)
}
}
在这个例子中,我们使用 libp2p.New 函数创建一个 libp2p 主机,并使用 mdns.NewMdnsService 函数创建一个 mDNS 服务。服务将节点加入名为 "my-rendezvous" 的 mDNS 群组,并每隔 10 秒宣布一次自己的服务信息。然后,我们使用 service.FindPeers 函数查找加入相同群组的其他节点,并打印出发现的节点列表。
请注意,mdns.NewMdnsService 函数将创建一个后台 goroutine,用于处理 mDNS 协议的消息,这可能会消耗一些 CPU 和内存资源。如果您不再需要 mDNS 服务,应该调用 service.Close() 函数来关闭服务并释放资源。
mdns只能在局域网吗
是的,mDNS 协议通常只能在局域网内使用,因为它使用多播地址(例如 224.0.0.251),多播地址只能在本地网络内部路由。这意味着,如果您的节点和其他节点不在同一个局域网内,它们将无法使用 mDNS 协议发现对等节点。
如果您需要在更大的网络环境中发现对等节点,可以考虑使用其他协议,例如 Kademlia 或者 DHT(分布式哈希表)。Kademlia 和 DHT 是两种 P2P 网络协议,它们可以帮助节点在更大的网络环境中发现和连接对等节点。libp2p 实现了 Kademlia 和 DHT 协议,您可以使用 dht.New 或 kaddht.New 函数创建一个 DHT 或 Kademlia 服务,并使用 dht.Provide 或 kaddht.Provide 函数提供您的节点的服务信息。其他节点可以使用 dht.FindProviders 或 kaddht.FindProviders 函数查找提供相同服务的节点。
ser := mdns.NewMdnsService(peerhost, rendezvous, n)
if err := ser.Start(); err != nil {
panic(err)
}
这段代码使用 mdns.NewMdnsService 函数创建了一个基于 mDNS 协议的服务,然后调用了 ser.Start() 方法来启动服务。
mdns.NewMdnsService 函数创建一个 mDNS 服务,它可以帮助节点在局域网内发现对等节点。该函数的签名如下:
func NewMdnsService(peerhost host.Host, rendezvous string, interval time.Duration) (discovery.Service, error)
NewMdnsService 函数接受三个参数:
-
peerhost:一个host.Host对象,表示服务所在的节点。 -
rendezvous:一个字符串,表示节点要加入的 mDNS 群组的名称。 -
interval:一个时间间隔,表示节点在群组中宣布自己的服务信息的时间间隔。
mdns.Service 接口定义了 Start, Close 和 FindPeers 方法,分别用于启动服务、关闭服务和查找加入同一群组的对等节点。
在上述代码中,mdns.NewMdnsService 函数返回了一个 discovery.Service 对象,然后我们调用该对象的 Start 方法来启动服务。如果启动服务失败,将会抛出一个错误并导致程序崩溃。
请注意,启动 mDNS 服务可能会在本地网络上发送多播消息,并在节点之间传输数据。因此,如果您的节点需要在公共互联网上运行,请注意网络安全问题,并确保您已经采取了必要的安全措施,以确保您的节点不会受到攻击。
ser := mdns.NewMdnsService(peerhost, rendezvous, n)
if err := ser.Start(); err != nil {
panic(err)
}这段代码里面ser.Start()会向peerstore中添加节点吗
不会,ser.Start() 方法不会将节点信息添加到 peerstore 中。
mdns.NewMdnsService() 方法创建的 MdnsService 对象实现了 discovery.Service 接口,它的作用是在局域网内使用 mDNS 协议发现其他节点。MdnsService 对象启动后,会不断发送 mDNS 查询消息,尝试发现加入同一群组的其他节点。当发现新节点时,MdnsService 对象会调用回调函数,将新节点的信息传递给回调函数。回调函数可以将新节点的信息存储在本地的数据结构中,但不会将其添加到 peerstore 中。
如果要将新节点的信息添加到 peerstore 中,可以在回调函数中调用 peerstore.AddAddrs() 方法将其添加到 peerstore 中。例如,可以使用以下代码将发现的节点信息添加到 peerstore 中:
func onPeerFound(info peer.AddrInfo) {
peerstore.AddAddrs(info.ID, info.Addrs, peerstore.PermanentAddrTTL)
}
在上述代码中,onPeerFound 函数是一个回调函数,它接受一个 peer.AddrInfo 对象,表示发现的节点的信息。peerstore.AddAddrs() 方法将节点的 ID 和地址列表添加到 peerstore 中,并将地址的生存时间设置为 peerstore.PermanentAddrTTL,表示这些地址永久有效。
请注意,将节点信息添加到 peerstore 中可能会涉及到网络安全问题。请确保您已经采取了必要的安全措施,以确保您的节点不会受到攻击。

浙公网安备 33010602011771号