Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
snail007
GitHub Repository: snail007/goproxy
Path: blob/master/utils/serve-channel.go
686 views
1
package utils
2
3
import (
4
"fmt"
5
"log"
6
"net"
7
"runtime/debug"
8
)
9
10
type ServerChannel struct {
11
ip string
12
port int
13
Listener *net.Listener
14
UDPListener *net.UDPConn
15
errAcceptHandler func(err error)
16
}
17
18
func NewServerChannel(ip string, port int) ServerChannel {
19
return ServerChannel{
20
ip: ip,
21
port: port,
22
errAcceptHandler: func(err error) {
23
fmt.Printf("accept error , ERR:%s", err)
24
},
25
}
26
}
27
func (sc *ServerChannel) SetErrAcceptHandler(fn func(err error)) {
28
sc.errAcceptHandler = fn
29
}
30
func (sc *ServerChannel) ListenTls(certBytes, keyBytes []byte, fn func(conn net.Conn)) (err error) {
31
sc.Listener, err = ListenTls(sc.ip, sc.port, certBytes, keyBytes)
32
if err == nil {
33
go func() {
34
defer func() {
35
if e := recover(); e != nil {
36
log.Printf("ListenTls crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
37
}
38
}()
39
for {
40
var conn net.Conn
41
conn, err = (*sc.Listener).Accept()
42
if err == nil {
43
go func() {
44
defer func() {
45
if e := recover(); e != nil {
46
log.Printf("connection handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
47
}
48
}()
49
fn(conn)
50
}()
51
} else {
52
sc.errAcceptHandler(err)
53
(*sc.Listener).Close()
54
break
55
}
56
}
57
}()
58
}
59
return
60
}
61
62
func (sc *ServerChannel) ListenTCP(fn func(conn net.Conn)) (err error) {
63
var l net.Listener
64
l, err = net.Listen("tcp", fmt.Sprintf("%s:%d", sc.ip, sc.port))
65
if err == nil {
66
sc.Listener = &l
67
go func() {
68
defer func() {
69
if e := recover(); e != nil {
70
log.Printf("ListenTCP crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
71
}
72
}()
73
for {
74
var conn net.Conn
75
conn, err = (*sc.Listener).Accept()
76
if err == nil {
77
go func() {
78
defer func() {
79
if e := recover(); e != nil {
80
log.Printf("connection handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
81
}
82
}()
83
fn(conn)
84
}()
85
} else {
86
sc.errAcceptHandler(err)
87
break
88
}
89
}
90
}()
91
}
92
return
93
}
94
func (sc *ServerChannel) ListenUDP(fn func(packet []byte, localAddr, srcAddr *net.UDPAddr)) (err error) {
95
addr := &net.UDPAddr{IP: net.ParseIP(sc.ip), Port: sc.port}
96
l, err := net.ListenUDP("udp", addr)
97
if err == nil {
98
sc.UDPListener = l
99
go func() {
100
defer func() {
101
if e := recover(); e != nil {
102
log.Printf("ListenUDP crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
103
}
104
}()
105
for {
106
var buf = make([]byte, 2048)
107
n, srcAddr, err := (*sc.UDPListener).ReadFromUDP(buf)
108
if err == nil {
109
packet := buf[0:n]
110
go func() {
111
defer func() {
112
if e := recover(); e != nil {
113
log.Printf("udp data handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack()))
114
}
115
}()
116
fn(packet, addr, srcAddr)
117
}()
118
} else {
119
sc.errAcceptHandler(err)
120
break
121
}
122
}
123
}()
124
}
125
return
126
}
127
128