/
packet.go
47 lines (37 loc) · 1.1 KB
/
packet.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
package node
import (
"encoding/json"
"fmt"
"net"
"strings"
)
func NewAnnouncePacket(n *NodeInfo) (string, error) {
jsonMessage, err := json.Marshal(n)
if err != nil {
return "", err
}
message := fmt.Sprintf("%s%s%s", HEADER, NODE_ANNOUNCE_COMMAND, jsonMessage)
return message, nil
}
func ParseAnnouncePacket(size int, addr *net.UDPAddr, packet []byte) (*NodeInfo, error) {
if size <= MIN_PACKET_SIZE {
return nil, fmt.Errorf("Invalid packet size")
}
if strings.Compare(string(packet[0:len(HEADER)]), HEADER) != 0 {
return nil, fmt.Errorf("Invalid packet header")
}
if string(packet[len(HEADER):len(HEADER)+1]) != NODE_ANNOUNCE_COMMAND[0:] {
return nil, fmt.Errorf("Command different than NODE_ANNOUNCE_COMMAND")
}
fmt.Println("Packet command is NODE_ANNOUNCE_COMMAND")
payload := string(packet[len(HEADER)+1:])
payload = strings.Trim(payload, "\x00")
nodeInfo := &NodeInfo{}
err := json.Unmarshal([]byte(payload), nodeInfo)
nodeInfo.Address = addr.IP.String()
nodeInfo.Id = fmt.Sprintf("%s-%s", nodeInfo.Id, nodeInfo.Address)
if err != nil {
return nil, err
}
return nodeInfo, nil
}