79 lines
1.1 KiB
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()
|
|
}
|