multiserver/proxy.go

79 lines
1.1 KiB
Go

package main
import (
"log"
"net"
"github.com/anon55555/mt/rudp"
)
// Proxy processes and forwards packets from src to dst
func Proxy(src, dst *Peer) {
if src == nil {
data := []byte{
0, ToClientAccessDenied,
AccessDeniedServerFail, 0, 0, 0, 0,
}
_, err := dst.Send(rudp.Pkt{Data: data})
if err != nil {
log.Print(err)
}
dst.SendDisco(0, true)
dst.Close()
processLeave(dst)
return
} else if dst == nil {
src.SendDisco(0, true)
src.Close()
return
}
for {
pkt, err := src.Recv()
if !src.Forward() {
return
} else if !dst.Forward() {
break
}
if err != nil {
if err == net.ErrClosed {
msg := src.Addr().String() + " disconnected"
if src.TimedOut() {
msg += " (timed out)"
}
log.Print(msg)
if !src.IsSrv() {
connectedPeersMu.Lock()
connectedPeers--
connectedPeersMu.Unlock()
processLeave(src)
}
break
}
log.Print(err)
continue
}
// Process
if processPktCommand(src, dst, &pkt) {
continue
}
// Forward
if _, err := dst.Send(pkt); err != nil {
log.Print(err)
}
}
dst.SendDisco(0, true)
dst.Close()
}