forked from Yuhang/xserver
/
server.go
102 lines (98 loc) · 1.99 KB
/
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
package xserver
import (
"time"
)
import (
"rtmfpserver/core/args"
"rtmfpserver/core/counts"
"rtmfpserver/core/handshake"
"rtmfpserver/core/rpc"
"rtmfpserver/core/rtmfp"
"rtmfpserver/core/session"
"rtmfpserver/core/tcp"
"rtmfpserver/core/udp"
"rtmfpserver/core/utils"
"rtmfpserver/core/xlog"
)
import (
_ "rtmfpserver/core/http"
)
func Start() {
shell := func(f func()) {
s := func() {
defer func() {
if x := recover(); x != nil {
counts.Count("server.panic", 1)
xlog.ErrLog.Printf("[server]: panic = %v\n%s\n", x, utils.Trace())
}
}()
f()
}
for {
s()
}
}
for _, udpsrv := range udp.GetServers() {
s := udpsrv
f := func() {
for {
if lport, addr, data := s.Recv(); addr != nil && len(data) != 0 {
if xid, err := rtmfp.PacketXid(data); err != nil {
continue
} else if xid == 0 {
handshake.HandlePacket(lport, addr, data)
} else {
session.HandlePacket(lport, addr, xid, data)
}
}
}
}
for i := 0; i < args.Parallel(); i++ {
go shell(f)
}
}
if s := tcp.GetServer(); s != nil {
f := func() {
for {
if bs := s.Recv(); len(bs) != 0 {
if x := rpc.DecodeXMessage(bs); x != nil {
if b := x.Broadcast; b != nil {
xids, data, reliable := b.Xids, b.Data, *b.Reliable
if len(xids) == 0 || len(data) == 0 {
continue
}
session.RecvPull(xids, data, reliable)
}
if c := x.Close; c != nil {
xids := c.Xids
if len(xids) == 0 {
continue
}
session.CloseAll(xids)
}
}
}
}
}
go shell(f)
}
if c := tcp.GetClient(); c != nil {
f := func() {
for {
if bs := c.Recv(); len(bs) != 0 {
if x := rpc.DecodeXResponse(bs); x != nil {
xid, data, callback, reliable := *x.Xid, x.Data, *x.Callback, *x.Reliable
if xid == 0 || len(data) == 0 {
continue
}
session.Callback(xid, data, callback, reliable)
}
}
}
}
go shell(f)
}
for {
time.Sleep(time.Minute)
}
}