diff options
author | anon5 <anon5clam@protonmail.com> | 2021-06-21 18:47:26 +0000 |
---|---|---|
committer | anon5 <anon5clam@protonmail.com> | 2021-06-21 18:47:26 +0000 |
commit | 425da65ed46061303604610bb539d6495b2b1f3f (patch) | |
tree | 10ae3e665132c369ce0207676321cef870679923 /cmd | |
parent | 9f239d341ef46b656dda759020da87bdd0606344 (diff) |
Add high-level protocol (de)serialization
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/proxy/proxy.go | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go new file mode 100644 index 0000000..33cc354 --- /dev/null +++ b/cmd/proxy/proxy.go @@ -0,0 +1,86 @@ +/* +Proxy is a Minetest proxy server +supporting multiple concurrent connections. + +Usage: + proxy dial:port listen:port +where dial:port is the server address +and listen:port is the address to listen on. +*/ +package main + +import ( + "errors" + "fmt" + "log" + "net" + "os" + + "github.com/anon55555/mt" +) + +func main() { + if len(os.Args) != 3 { + fmt.Fprintln(os.Stderr, "usage: proxy dial:port listen:port") + os.Exit(1) + } + + srvaddr, err := net.ResolveUDPAddr("udp", os.Args[1]) + if err != nil { + log.Fatal(err) + } + + lc, err := net.ListenPacket("udp", os.Args[2]) + if err != nil { + log.Fatal(err) + } + defer lc.Close() + + l := mt.Listen(lc) + for { + clt, err := l.Accept() + if err != nil { + log.Print(err) + continue + } + + log.Print(clt.RemoteAddr().String() + " connected") + + conn, err := net.DialUDP("udp", nil, srvaddr) + if err != nil { + log.Print(err) + continue + } + srv := mt.Connect(conn) + + go proxy(clt, srv) + go proxy(srv, clt) + } +} + +func proxy(src, dest mt.Peer) { + s := fmt.Sprint(src.ID(), " (", src.RemoteAddr(), "): ") + + for { + pkt, err := src.Recv() + if err != nil { + if errors.Is(err, net.ErrClosed) { + if err := src.WhyClosed(); err != nil { + log.Print(s, "disconnected: ", err) + } else { + log.Print(s, "disconnected") + } + break + } + + log.Print(s, err) + continue + } + + if _, err := dest.Send(pkt); err != nil { + log.Print(err) + } + } + + dest.Close() +} |