/
client.go
87 lines (70 loc) · 1.22 KB
/
client.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
package proxymate
import (
"github.com/davecgh/go-spew/spew"
"log"
"net"
"time"
)
type Client struct {
Addr string
Rate int
conn net.Conn
quit chan chan bool
}
func DialAndPing(addr string, rate int) (c *Client, err error) {
c, err = Dial(addr)
if err != nil {
return
}
c.Ping(rate)
return
}
func Dial(addr string) (c *Client, err error) {
tcpAddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
return
}
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
return
}
c = &Client{
Addr: addr,
conn: conn,
quit: make(chan chan bool),
}
return
}
func (c *Client) Ping(rate int) {
go func() {
const (
REQUEST = "ping"
)
defer c.conn.Close()
recv, fault := Pump(c.conn, 32)
for {
select {
case buf := <-recv:
spew.Dump(buf)
case err := <-fault:
log.Println("client read error: ", err)
break
case <-time.After(time.Duration(rate) * time.Second):
_, err := c.conn.Write([]byte(REQUEST))
if err != nil {
log.Println("client write error: ", err)
break
}
case done := <-c.quit:
done <- true
break
}
}
}()
}
func (c *Client) Stop() {
log.Println("stopping client")
done := make(chan bool)
c.quit <- done
<-done
}