-
Notifications
You must be signed in to change notification settings - Fork 0
/
reg_server.go
125 lines (108 loc) · 2.4 KB
/
reg_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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package reg
// xlReg_go/reg_server.go
import (
"fmt"
xt "github.com/jddixon/xlTransport_go"
"io"
"net"
)
var _ = fmt.Printf
type RegServer struct {
Testing bool // serialized
Verbosity int // serialized
DoneCh chan (bool)
Registry
}
func NewRegServer(reg *Registry, testing bool, verbosity int) (
rs *RegServer, err error) {
if reg == nil {
err = NilRegistry
} else {
rs = &RegServer{
Testing: testing,
Verbosity: verbosity,
Registry: *reg,
DoneCh: make(chan bool, 1),
}
}
return
}
func (rs *RegServer) Stop() {
acc := rs.GetAcceptor()
if acc != nil {
acc.Close()
}
}
func (rs *RegServer) GetAcceptor() xt.AcceptorI {
return rs.Registry.GetAcceptor(0)
}
// Starts the server running in a goroutine. Does not block.
func (rs *RegServer) Start() (err error) {
err = rs.OpenAcc() // opens RegNode's acceptor
// DEBUG
acc := rs.GetAcceptor()
if acc == nil {
fmt.Printf("RegServer.Start: acceptor is NIL\n")
} else {
fmt.Printf("RegServer.Start(): acceptor is %s\n", acc.String())
}
// END
if err == nil {
go func() {
for {
logger := rs.Registry.Logger
// As each client connects its connection is passed to a
// handler running in a separate goroutine.
cnx, err := rs.GetAcceptor().Accept()
if err != nil {
// SHOULD NOT CONTINUE IF 'use of closed network connection";
// this yields an infinite loop if the listening socket has
// been closed to shut down the server.
netOpError, ok := err.(*net.OpError)
if ok && netOpError.Err.Error() == "use of closed network connection" {
err = nil
} else {
logger.Printf(
"fatal I/O error %v, shutting down the server\n",
err)
}
break
}
go func() {
var (
h *InHandler
)
h, err = NewInHandler(&rs.Registry, cnx)
if err == nil {
err = h.Start()
}
if err != nil {
if err != io.EOF {
logger.Printf(
"I/O error %v, closing client connection\n", err)
}
cnx := h.Cnx
if cnx != nil {
cnx.Close()
}
}
}()
}
rs.DoneCh <- true
}()
}
return
}
// SERIALIZATION ====================================================
func ParseRegServer(s string) (rs *RegServer, rest []string, err error) {
// XXX STUB
return
}
func (rs *RegServer) String() (s string) {
// STUB XXX
return
}
func (rs *RegServer) Strings() (s []string) {
// STUB XXX
return
}