-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy.go
73 lines (59 loc) · 1.31 KB
/
proxy.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
package main
import (
"flag"
"log"
"net"
"runtime"
"stathat.com/c/consistent"
)
var clientMap map[string]*node = make(map[string]*node)
var cons = consistent.New()
func makeAddr(port int, host string) net.UDPAddr {
return net.UDPAddr{Port: port, IP: net.ParseIP(host)}
}
func makeConn(version string, port int, host string) (*net.UDPConn, error) {
addr := makeAddr(port, host)
return net.ListenUDP(version, &addr)
}
func setup(nodes []node) {
// setup clients and hash ring
cons.NumberOfReplicas = 1
for i := 0; i < len(nodes); i++ {
n := &nodes[i]
n.Addr = makeAddr(n.Port, n.Host)
n.Add()
clientMap[n.Name()] = n
}
}
func startServer(version string, port int, host string) error {
conn, err := makeConn(version, port, host)
if err != nil {
return err
}
return readPackets(conn)
}
func readPackets(conn *net.UDPConn) error {
defer conn.Close()
for {
b := make([]byte, 1024)
n, _, err := conn.ReadFromUDP(b)
if err != nil {
return err
}
p := packet{Length: n, Buffer: b}
go p.handle(conn)
}
return nil
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
env := flag.String("e", "development", "the program environment")
flag.Parse()
var c config
err := c.read(*env)
if err != nil {
log.Fatal(err)
}
setup(c.Nodes)
log.Fatal(startServer(c.UdpVersion, c.Port, c.Host))
}