summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authoranon5 <anon5clam@protonmail.com>2021-06-21 18:47:26 +0000
committeranon5 <anon5clam@protonmail.com>2021-06-21 18:47:26 +0000
commit425da65ed46061303604610bb539d6495b2b1f3f (patch)
tree10ae3e665132c369ce0207676321cef870679923 /cmd
parent9f239d341ef46b656dda759020da87bdd0606344 (diff)
Add high-level protocol (de)serialization
Diffstat (limited to 'cmd')
-rw-r--r--cmd/proxy/proxy.go86
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()
+}