-
Notifications
You must be signed in to change notification settings - Fork 0
/
wrap.go
108 lines (98 loc) · 1.86 KB
/
wrap.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
package relayer
import (
"encoding/gob"
"log"
"net"
"github.com/bzEq/bxrx/core"
"github.com/bzEq/bxrx/proxy/wrap"
)
type WrapFE struct {
ln *net.TCPListener
pc core.PortCreator
}
func NewWrapFE(ln *net.TCPListener, pc core.PortCreator) *WrapFE {
return &WrapFE{ln, pc}
}
func (self *WrapFE) handshake(c net.Conn) (p core.Port, addr string, err error) {
p = self.pc.Create(c)
var b core.IoVec
err = p.Unpack(&b)
if err != nil {
err = core.Tr(err)
return
}
dec := gob.NewDecoder(&b)
var req wrap.TCPRequest
err = dec.Decode(&req)
if err != nil {
err = core.Tr(err)
return
}
addr = req.Addr
return
}
func (self *WrapFE) Accept() (ch chan core.AcceptResult) {
ch = make(chan core.AcceptResult)
c, err := self.ln.Accept()
if err != nil {
log.Println(err)
close(ch)
return
}
go func() {
p, addr, err := self.handshake(c)
if err != nil {
log.Println(err)
close(ch)
c.Close()
return
}
ch <- core.AcceptResult{p, addr}
}()
return
}
func NewWrapBE(raddr string, pc core.PortCreator) *WrapBE {
return &WrapBE{raddr, pc}
}
type WrapBE struct {
raddr string
pc core.PortCreator
}
func (self *WrapBE) handshake(c net.Conn, addr string) (p core.Port, err error) {
var b core.IoVec
enc := gob.NewEncoder(&b)
req := wrap.TCPRequest{addr}
err = enc.Encode(&req)
if err != nil {
err = core.Tr(err)
return
}
p = self.pc.Create(c)
err = p.Pack(&b)
if err != nil {
err = core.Tr(err)
return
}
return
}
func (self *WrapBE) Dial(addr string) (ch chan core.DialResult) {
ch = make(chan core.DialResult)
go func() {
c, err := net.Dial("tcp", self.raddr)
if err != nil {
log.Println(err)
close(ch)
return
}
log.Println("Relaying to", addr, "at", c.LocalAddr())
p, err := self.handshake(c, addr)
if err != nil {
log.Println(err)
close(ch)
c.Close()
return
}
ch <- core.DialResult{p}
}()
return
}