105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/libp2p/go-libp2p"
|
|
peerstore "github.com/libp2p/go-libp2p/core/peer"
|
|
"github.com/libp2p/go-libp2p/p2p/protocol/ping"
|
|
"github.com/libp2p/go-libp2p/p2p/security/noise"
|
|
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
|
|
multiaddr "github.com/multiformats/go-multiaddr"
|
|
)
|
|
|
|
const help = `pear [options] [<multiaddr>]
|
|
|
|
Options:
|
|
-h Output this help
|
|
`
|
|
|
|
func main() {
|
|
var (
|
|
helpFlag bool
|
|
portFlag string
|
|
)
|
|
|
|
flag.BoolVar(&helpFlag, "h", false, "output help")
|
|
flag.StringVar(&portFlag, "p", "9000", "port to listen on")
|
|
flag.Parse()
|
|
|
|
if helpFlag {
|
|
fmt.Printf(help)
|
|
os.Exit(0)
|
|
}
|
|
|
|
opts := []libp2p.Option{
|
|
libp2p.RandomIdentity,
|
|
libp2p.DisableMetrics(),
|
|
libp2p.DisableRelay(),
|
|
libp2p.Security(noise.ID, noise.New),
|
|
libp2p.Transport(tcp.NewTCPTransport),
|
|
libp2p.DefaultPeerstore,
|
|
libp2p.DefaultConnectionManager,
|
|
libp2p.DefaultMuxers,
|
|
libp2p.ListenAddrStrings(
|
|
fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", portFlag),
|
|
),
|
|
libp2p.NATPortMap(),
|
|
libp2p.Ping(false),
|
|
}
|
|
|
|
pear, err := libp2p.NewWithoutDefaults(opts...)
|
|
if err != nil {
|
|
log.Fatalf("failed to initialise libp2p: %s", err)
|
|
}
|
|
|
|
pingService := &ping.PingService{Host: pear}
|
|
pear.SetStreamHandler(ping.ID, pingService.PingHandler)
|
|
|
|
peerId, err := multiaddr.NewMultiaddr(fmt.Sprintf("/p2p/%s", pear.ID().Pretty()))
|
|
if err != nil {
|
|
log.Fatalf("failed to create new multiaddr: %s", err)
|
|
}
|
|
|
|
for _, addr := range pear.Addrs() {
|
|
fmt.Println(addr.Encapsulate(peerId))
|
|
}
|
|
|
|
maddr := flag.Arg(0)
|
|
if maddr != "" {
|
|
addr, err := multiaddr.NewMultiaddr(maddr)
|
|
if err != nil {
|
|
log.Fatalf("failed to parse %s: %s", maddr, err)
|
|
}
|
|
|
|
peer, err := peerstore.AddrInfoFromP2pAddr(addr)
|
|
if err != nil {
|
|
log.Fatalf("failed to add %s to peer store: %s", addr, err)
|
|
}
|
|
|
|
if err := pear.Connect(context.Background(), *peer); err != nil {
|
|
log.Fatalf("failed to connect to %s: %s", peer, err)
|
|
}
|
|
|
|
ch := pingService.Ping(context.Background(), peer.ID)
|
|
for i := 0; i < 5; i++ {
|
|
res := <-ch
|
|
fmt.Println("pinged", addr, "in", res.RTT)
|
|
}
|
|
}
|
|
|
|
ch := make(chan os.Signal, 1)
|
|
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
|
|
<-ch
|
|
|
|
if err := pear.Close(); err != nil {
|
|
log.Fatalf("failed to shutdown: %s", err)
|
|
}
|
|
}
|