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.Newkaddht.New 函数创建一个 DHT 或 Kademlia 服务,并使用 dht.Providekaddht.Provide 函数提供您的节点的服务信息。其他节点可以使用 dht.FindProviderskaddht.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, CloseFindPeers 方法,分别用于启动服务、关闭服务和查找加入同一群组的对等节点。

在上述代码中,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 中可能会涉及到网络安全问题。请确保您已经采取了必要的安全措施,以确保您的节点不会受到攻击。

posted @ 2024-03-04 21:35  lovevivi121  阅读(121)  评论(0)    收藏  举报  来源