11package proxy
22
33import (
4- "encoding/hex"
5- "fmt"
64"net"
75"net/url"
86
@@ -16,7 +14,7 @@ type SocketServer struct {
1614ListenPort int
1715Destination string
1816
19- listener net.PacketConn
17+ listener * net.UDPConn
2018agents map [string ]* agent
2119}
2220
@@ -32,7 +30,11 @@ func New(listen, dest string) SocketServer {
3230
3331func (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 )
3638if err != nil {
3739return err
3840}
@@ -51,26 +53,23 @@ func (s *SocketServer) Start() error {
5153p := make ([]byte , 65535 )
5254
5355for {
54- n , addr , err := s .listener .ReadFrom (p )
56+ n , addr , err := s .listener .ReadFromUDP (p )
5557if err != nil {
5658logrus .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
5965continue
6066}
61- //logrus.WithField("remote", addr.String()).Info("Accepted UDP connection")
67+
68+ data := make ([]byte , n )
69+ copy (data , p [:n ])
6270
6371a := 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 {
8079return 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 {
8685return a
8786}
8887
@@ -94,12 +93,18 @@ func (s *SocketServer) getAgent(ip net.Addr) *agent {
9493}
9594
9695a = & 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 )
101102go 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+ }
104109return a
105110}
0 commit comments