forked from tongxin97/noise
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
70 lines (63 loc) · 1.67 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
package main
import (
"bufio"
"flag"
"os"
"sync/atomic"
"github.com/guyu96/noise/log"
"github.com/guyu96/noise/network"
kad "github.com/guyu96/noise/skademlia"
)
var (
host = "127.0.0.1"
minPort = uint16(9000)
activePort = uint16(8000)
numPeers = 32
numBootstrapPeers = 4
peersFile = "peers.txt"
keypairsFile = "keypairs.txt"
)
func main() {
createFlag := flag.Bool("create-peers", false, "")
portFlag := flag.Uint("p", uint(minPort), "")
flag.Parse()
if *createFlag {
peers, keypairs, err := network.CreatePeers(host, minPort, numPeers)
if err != nil {
panic(err)
}
kad.PersistIDs(peersFile, peers)
kad.PersistKeypairs(keypairsFile, keypairs)
log.Info().Msgf("created %v peers", numPeers)
return
}
peers := kad.LoadIDs(peersFile)
keypairs := kad.LoadKeypairs(keypairsFile)
if uint16(*portFlag) == activePort {
peerAddrs := network.RandBootstrapAddrs(peers, numBootstrapPeers)
ntw, err := network.New(host, activePort, kad.RandomKeys())
if err != nil {
panic(err)
}
doneBeforeTimeout := ntw.BootstrapDefault(peerAddrs)
log.Info().Msgf("connected to %v peers: | done before timeout: %v", ntw.GetNumPeers(), doneBeforeTimeout)
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
panic(err)
}
ntw.Broadcast(0, []byte(input))
}
} else {
rcvCount := uint32(0)
_, broadcastChan := network.RunPeers(peers, keypairs, numBootstrapPeers)
for {
select {
case msg := <-broadcastChan:
atomic.AddUint32(&rcvCount, 1)
log.Info().Msgf("msg: %s, total rcv count: %d", msg.Data, atomic.LoadUint32(&rcvCount))
}
}
}
}