This repository has been archived by the owner on Mar 2, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.go
113 lines (91 loc) · 2.02 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main
import (
"bytes"
"context"
"fmt"
"io"
// "io/ioutil"
"log"
"os"
"time"
circuit "github.com/libp2p/go-libp2p-circuit"
crypto "github.com/libp2p/go-libp2p-crypto"
metrics "github.com/libp2p/go-libp2p-metrics"
peer "github.com/libp2p/go-libp2p-peer"
pstore "github.com/libp2p/go-libp2p-peerstore"
swarm "github.com/libp2p/go-libp2p-swarm"
bhost "github.com/libp2p/go-libp2p/p2p/host/basic"
ma "github.com/multiformats/go-multiaddr"
)
const Proto = "/relay/test/echo"
func main() {
if len(os.Args) != 3 {
fmt.Fprintf(os.Stderr, "Usage: %s <echod-address> <msg>\n", os.Args[0])
os.Exit(1)
}
paddr, err := ma.NewMultiaddr(os.Args[1])
if err != nil {
log.Fatal(err)
}
pinfo, err := pstore.InfoFromP2pAddr(paddr)
if err != nil {
log.Fatal(err)
}
// need a binding to be able to dial ws addresses
wsaddr, err := ma.NewMultiaddr("/ip4/0.0.0.0/tcp/0/ws")
if err != nil {
log.Fatal(err)
}
privk, pubk, err := crypto.GenerateKeyPair(crypto.RSA, 2048)
if err != nil {
log.Fatal(err)
}
id, err := peer.IDFromPrivateKey(privk)
if err != nil {
log.Fatal(err)
}
ps := pstore.NewPeerstore()
ps.AddPrivKey(id, privk)
ps.AddPubKey(id, pubk)
ctx := context.Background()
netw, err := swarm.NewNetwork(
ctx,
[]ma.Multiaddr{wsaddr},
id,
ps,
metrics.NewBandwidthCounter(),
)
if err != nil {
log.Fatal(err)
}
host := bhost.New(netw)
err = circuit.AddRelayTransport(ctx, host)
if err != nil {
log.Fatal(err)
}
rctx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
err = host.Connect(rctx, pstore.PeerInfo{pinfo.ID, []ma.Multiaddr{paddr}})
if err != nil {
log.Fatal(err)
}
s, err := host.NewStream(rctx, pinfo.ID, Proto)
if err != nil {
log.Fatal(err)
}
msg := []byte(os.Args[2])
s.Write(msg)
data := make([]byte, len(msg))
_, err = s.Read(data)
if err != nil && err != io.EOF {
log.Fatal(err)
}
s.Close()
fmt.Printf("Peer says: %s\n", string(data))
if bytes.Equal(data, msg) {
fmt.Printf("OK\n")
} else {
fmt.Printf("ERROR\n")
os.Exit(1)
}
}