summaryrefslogtreecommitdiff
path: root/rudp/proxy/proxy.go
diff options
context:
space:
mode:
Diffstat (limited to 'rudp/proxy/proxy.go')
-rw-r--r--rudp/proxy/proxy.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/rudp/proxy/proxy.go b/rudp/proxy/proxy.go
new file mode 100644
index 0000000..6fc14ec
--- /dev/null
+++ b/rudp/proxy/proxy.go
@@ -0,0 +1,85 @@
+/*
+Proxy is a Minetest RUDP 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 (
+ "fmt"
+ "log"
+ "net"
+ "os"
+
+ "github.com/anon55555/mt/rudp"
+)
+
+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 := rudp.Listen(lc)
+ for {
+ clt, err := l.Accept()
+ if err != nil {
+ log.Print(err)
+ continue
+ }
+
+ log.Print(clt.Addr(), " connected")
+
+ conn, err := net.DialUDP("udp", nil, srvaddr)
+ if err != nil {
+ log.Print(err)
+ continue
+ }
+ srv := rudp.Connect(conn, conn.RemoteAddr())
+
+ go proxy(clt, srv)
+ go proxy(srv, clt)
+ }
+}
+
+func proxy(src, dest *rudp.Peer) {
+ for {
+ pkt, err := src.Recv()
+ if err != nil {
+ if err == rudp.ErrClosed {
+ msg := src.Addr().String() + " disconnected"
+ if src.TimedOut() {
+ msg += " (timed out)"
+ }
+ log.Print(msg)
+
+ break
+ }
+
+ log.Print(err)
+ continue
+ }
+
+ if _, err := dest.Send(pkt); err != nil {
+ log.Print(err)
+ }
+ }
+
+ dest.SendDisco(0, true)
+ dest.Close()
+}