]> git.lizzy.rs Git - mt.git/blob - rudp/cmd/proxy/proxy.go
Add high-level protocol (de)serialization
[mt.git] / rudp / cmd / 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         "errors"
14         "fmt"
15         "log"
16         "net"
17         "os"
18
19         "github.com/anon55555/mt/rudp"
20 )
21
22 func main() {
23         if len(os.Args) != 3 {
24                 fmt.Fprintln(os.Stderr, "usage: proxy dial:port listen:port")
25                 os.Exit(1)
26         }
27
28         pc, err := net.ListenPacket("udp", os.Args[2])
29         if err != nil {
30                 log.Fatal(err)
31         }
32         defer pc.Close()
33
34         l := rudp.Listen(pc)
35         for {
36                 clt, err := l.Accept()
37                 if err != nil {
38                         log.Print("accept: ", err)
39                         continue
40                 }
41
42                 log.Print(clt.ID(), ": connected")
43
44                 conn, err := net.Dial("udp", os.Args[1])
45                 if err != nil {
46                         log.Print(err)
47                         continue
48                 }
49                 srv := rudp.Connect(conn)
50
51                 go proxy(clt, srv)
52                 go proxy(srv, clt)
53         }
54 }
55
56 func proxy(src, dest *rudp.Conn) {
57         s := fmt.Sprint(src.ID(), " (", src.RemoteAddr(), "): ")
58
59         for {
60                 pkt, err := src.Recv()
61                 if err != nil {
62                         if errors.Is(err, net.ErrClosed) {
63                                 if err := src.WhyClosed(); err != nil {
64                                         log.Print(s, "disconnected: ", err)
65                                 } else {
66                                         log.Print(s, "disconnected")
67                                 }
68                                 break
69                         }
70
71                         log.Print(s, err)
72                         continue
73                 }
74
75                 dest.Send(pkt)
76         }
77
78         dest.Close()
79 }