/
tcp_server.go
77 lines (65 loc) · 1.55 KB
/
tcp_server.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
// tcp server library.
package server
import (
"crypto/tls"
"net"
)
type TCPHandler interface {
Handle(net.Conn)
}
type TCPServer struct {
addr string
handler TCPHandler
useTls bool
}
// start will keep accepting and serving tcp connections.
func (ts *TCPServer) Start() error {
// check for conditions
if ts.handler == nil {
return errorf(errTCPHandlerNotRegistered)
}
// listen
var ln net.Listener
var err error
if ts.useTls {
// if use tls, then load pem files and start server
if *confCAFile == "" {
return errorf(errMissingFlag, FlagCAFile)
}
if *confKeyFile == "" {
return errorf(errMissingFlag, FlagKeyFile)
}
// process key files
cert, err := tls.LoadX509KeyPair(*confCAFile, *confKeyFile)
if err != nil {
return errorf(errLoadSecureKey, err.Error())
}
// config server with tls
config := tls.Config{Certificates: []tls.Certificate{cert}}
// listen for new connection
ln, err = tls.Listen("tcp", ts.addr, &config)
if err != nil {
return errorf(errListenFailed, ts.addr, err)
}
} else {
// don't use tls, just listen
ln, err = net.Listen("tcp", ts.addr)
if err != nil {
return errorf(errListenFailed, ts.addr, err)
}
}
Log.Infof("TCP Server Listen on %s, use tls: %v", ts.addr, ts.useTls)
// continously accept connections and serve, nonblock
go func() {
for {
conn, err := ln.Accept()
if err != nil {
Log.Errorf(errNewConnection, err.Error())
continue
}
Log.Infof("accepting new connection %s", conn.RemoteAddr())
go ts.handler.Handle(conn)
}
}()
return nil
}