]> git.lizzy.rs Git - mt.git/blob - rudp/proxy/proxy.go
Initial public release
[mt.git] / rudp / proxy / proxy.go
1 /*
2 Proxy is a Minetest RUDP proxy server
3 supporting multiple concurrent connections.
4
5 Usage:
6         proxy dial:port listen:port
7 where dial:port is the server address
8 and listen:port is the address to listen on.
9 */
10 package main
11
12 import (
13         "fmt"
14         "log"
15         "net"
16         "os"
17
18         "github.com/anon55555/mt/rudp"
19 )
20
21 func main() {
22         if len(os.Args) != 3 {
23                 fmt.Fprintln(os.Stderr, "usage: proxy dial:port listen:port")
24                 os.Exit(1)
25         }
26
27         srvaddr, err := net.ResolveUDPAddr("udp", os.Args[1])
28         if err != nil {
29                 log.Fatal(err)
30         }
31
32         lc, err := net.ListenPacket("udp", os.Args[2])
33         if err != nil {
34                 log.Fatal(err)
35         }
36         defer lc.Close()
37
38         l := rudp.Listen(lc)
39         for {
40                 clt, err := l.Accept()
41                 if err != nil {
42                         log.Print(err)
43                         continue
44                 }
45
46                 log.Print(clt.Addr(), " connected")
47
48                 conn, err := net.DialUDP("udp", nil, srvaddr)
49                 if err != nil {
50                         log.Print(err)
51                         continue
52                 }
53                 srv := rudp.Connect(conn, conn.RemoteAddr())
54
55                 go proxy(clt, srv)
56                 go proxy(srv, clt)
57         }
58 }
59
60 func proxy(src, dest *rudp.Peer) {
61         for {
62                 pkt, err := src.Recv()
63                 if err != nil {
64                         if err == rudp.ErrClosed {
65                                 msg := src.Addr().String() + " disconnected"
66                                 if src.TimedOut() {
67                                         msg += " (timed out)"
68                                 }
69                                 log.Print(msg)
70
71                                 break
72                         }
73
74                         log.Print(err)
75                         continue
76                 }
77
78                 if _, err := dest.Send(pkt); err != nil {
79                         log.Print(err)
80                 }
81         }
82
83         dest.SendDisco(0, true)
84         dest.Close()
85 }