Skip to content

Commit 2445628

Browse files
committed
Move to ListenUDP + use channel
1 parent 73b2a16 commit 2445628

File tree

2 files changed

+80
-33
lines changed

2 files changed

+80
-33
lines changed

proxy/agent.go

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,41 @@ import (
1010
)
1111

1212
type agent struct {
13-
remote net.Addr
14-
sock net.PacketConn
15-
ws *websocket.Conn
13+
sock *net.UDPConn
14+
ws *websocket.Conn
15+
addr *net.UDPAddr
16+
17+
running bool
18+
udpData chan []byte
1619
}
1720

1821
func (a *agent) ws2sock() {
1922
log := logrus.WithFields(logrus.Fields{
20-
"remote": a.remote.String(),
23+
"remote": a.addr.String(),
2124
"func": "ws2sock",
2225
})
23-
defer a.ws.Close()
26+
defer func() {
27+
a.ws.Close()
28+
a.running = false
29+
}()
2430

2531
for {
2632
t, p, err := a.ws.ReadMessage()
2733
if err != nil {
2834
log.WithField("err", err).Error("Could not read WebSocket message")
2935
return
3036
}
31-
log.Info("Got WS message")
37+
38+
if logExchanges {
39+
log.Info("Got WS message")
40+
}
3241

3342
if t != websocket.BinaryMessage {
3443
log.Error("Wrong message type")
3544
return
3645
}
3746

38-
n, err := a.sock.WriteTo(p, a.remote)
47+
n, err := a.sock.WriteTo(p, a.addr)
3948
if err != nil {
4049
log.WithError(err).Error("Could not write to socket")
4150
return
@@ -48,8 +57,41 @@ func (a *agent) ws2sock() {
4857
}).Error("Did not write full message")
4958
return
5059
}
51-
log.Info("Successfully sent WS message to socket")
5260

53-
fmt.Println(hex.Dump(p))
61+
if logExchanges {
62+
log.Info("Successfully sent WS message to socket")
63+
}
64+
65+
if hexdumpPackets {
66+
fmt.Println(hex.Dump(p))
67+
}
68+
}
69+
}
70+
71+
func (a *agent) sock2ws() {
72+
log := logrus.WithFields(logrus.Fields{
73+
"remote": a.addr.String(),
74+
"func": "sock2ws",
75+
})
76+
77+
defer func() {
78+
a.ws.Close()
79+
a.running = false
80+
}()
81+
82+
for p := range a.udpData {
83+
err := a.ws.WriteMessage(websocket.BinaryMessage, p)
84+
if err != nil {
85+
log.WithField("err", err).Error("Could not WriteMessage()")
86+
return
87+
}
88+
89+
if logExchanges {
90+
log.Info("Successfully sent UDP message to WebSocket")
91+
}
92+
93+
if hexdumpPackets {
94+
fmt.Println(hex.Dump(p))
95+
}
5496
}
5597
}

proxy/server.go

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package proxy
22

33
import (
4-
"encoding/hex"
5-
"fmt"
64
"net"
75
"net/url"
86

@@ -16,7 +14,7 @@ type SocketServer struct {
1614
ListenPort int
1715
Destination string
1816

19-
listener net.PacketConn
17+
listener *net.UDPConn
2018
agents map[string]*agent
2119
}
2220

@@ -32,7 +30,11 @@ func New(listen, dest string) SocketServer {
3230

3331
func (s *SocketServer) listen() error {
3432
// Socket server
35-
listener, err := net.ListenPacket("udp4", fmt.Sprintf("%s:%d", s.ListenAddress, s.ListenPort))
33+
addr := net.UDPAddr{
34+
Port: s.ListenPort,
35+
IP: net.ParseIP(s.ListenAddress),
36+
}
37+
listener, err := net.ListenUDP("udp4", &addr)
3638
if err != nil {
3739
return err
3840
}
@@ -51,26 +53,23 @@ func (s *SocketServer) Start() error {
5153
p := make([]byte, 65535)
5254

5355
for {
54-
n, addr, err := s.listener.ReadFrom(p)
56+
n, addr, err := s.listener.ReadFromUDP(p)
5557
if err != nil {
5658
logrus.WithFields(logrus.Fields{
5759
"err": err,
58-
}).Error("Could not ReadFrom() a connection")
60+
}).Error("Could not ReadFromUDP() a connection, removing")
61+
a := s.getAgent(addr)
62+
63+
a.ws.Close()
64+
a.running = false
5965
continue
6066
}
61-
//logrus.WithField("remote", addr.String()).Info("Accepted UDP connection")
67+
68+
data := make([]byte, n)
69+
copy(data, p[:n])
6270

6371
a := s.getAgent(addr)
64-
err = a.ws.WriteMessage(websocket.BinaryMessage, p[:n])
65-
if err != nil {
66-
logrus.WithFields(logrus.Fields{
67-
"err": err,
68-
"remote": addr.String(),
69-
}).Error("Could not WriteMessage()")
70-
continue
71-
}
72-
logrus.WithField("remote", addr.String()).Info("Successfully sent UDP message to WebSocket")
73-
fmt.Println(hex.Dump(p[:n]))
72+
a.udpData <- data
7473
}
7574

7675
}
@@ -80,9 +79,9 @@ func (s *SocketServer) Close() error {
8079
return s.listener.Close()
8180
}
8281

83-
func (s *SocketServer) getAgent(ip net.Addr) *agent {
84-
a, ok := s.agents[ip.String()]
85-
if ok {
82+
func (s *SocketServer) getAgent(addr *net.UDPAddr) *agent {
83+
a, ok := s.agents[addr.String()]
84+
if ok && a.running {
8685
return a
8786
}
8887

@@ -94,12 +93,18 @@ func (s *SocketServer) getAgent(ip net.Addr) *agent {
9493
}
9594

9695
a = &agent{
97-
ws: ws,
98-
sock: s.listener,
99-
remote: ip,
96+
ws: ws,
97+
sock: s.listener,
98+
addr: addr,
99+
running: true,
100100
}
101+
a.udpData = make(chan []byte, 10000)
101102
go a.ws2sock()
102-
s.agents[ip.String()] = a
103+
go a.sock2ws()
104+
s.agents[addr.String()] = a
103105

106+
if logNewConnections {
107+
logrus.WithField("remote", addr.String()).Info("New client")
108+
}
104109
return a
105110
}

0 commit comments

Comments
 (0)