-
Notifications
You must be signed in to change notification settings - Fork 13
/
node.go
71 lines (56 loc) · 1.37 KB
/
node.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
package src
import (
"bytes"
"encoding/gob"
"log"
"net"
"rhizome/src/protocol"
"strings"
)
// Node is a peer node
type Node struct {
Socket net.Conn
}
// ProcessMessages processes all incoming messages
func (node *Node) ProcessMessages() {
defer node.Socket.Close()
dec := gob.NewDecoder(node.Socket)
var msg protocol.Message
if err := dec.Decode(&msg); err != nil {
log.Println(err)
return
}
log.Printf("Message received : %v\n", msg)
switch msg.Command {
case protocol.CmdJoin:
peerAddr := make([]string, 0)
for _, n := range nodeList {
peerAddr = append(peerAddr, n.GetIPAddress())
}
sendMsg := protocol.Message{
Command: protocol.CmdAddresses,
Payload: peerAddr,
}
node.SendMessage(sendMsg)
if !IsListedNode(node) {
nodeList = append(nodeList, node)
}
case protocol.CmdAddresses:
// TODO Add addresses to list
log.Printf("Addresses : %v\n", msg)
}
}
// SendMessage sends a message to a node
func (node *Node) SendMessage(msg protocol.Message) error {
var buffer bytes.Buffer
enc := gob.NewEncoder(&buffer)
if err := enc.Encode(msg); err != nil {
return err
}
_, err := node.Socket.Write(buffer.Bytes())
return err
}
// GetIPAddress returns the IP address of the node pointing on its default port
func (node *Node) GetIPAddress() string {
return strings.Split(node.Socket.RemoteAddr().String(), ":")[0] + DefaultPort
}