2021-01-05 11:34:35 -08:00
|
|
|
package multiserver
|
|
|
|
|
|
|
|
import "log"
|
|
|
|
|
2021-01-17 12:43:23 -08:00
|
|
|
// Proxy processes and forwards packets from src to dst
|
2021-01-05 11:34:35 -08:00
|
|
|
func Proxy(src, dst *Peer) {
|
|
|
|
for {
|
|
|
|
pkt, err := src.Recv()
|
|
|
|
if !src.Forward() {
|
|
|
|
return
|
|
|
|
} else if !dst.Forward() {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
if err == ErrClosed {
|
|
|
|
msg := src.Addr().String() + " disconnected"
|
|
|
|
if src.TimedOut() {
|
|
|
|
msg += " (timed out)"
|
|
|
|
}
|
|
|
|
log.Print(msg)
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-06 05:42:55 -08:00
|
|
|
if !src.IsSrv() {
|
2021-01-10 13:37:42 -08:00
|
|
|
connectedPeersMu.Lock()
|
2021-01-06 05:42:55 -08:00
|
|
|
connectedPeers--
|
2021-01-10 13:37:42 -08:00
|
|
|
connectedPeersMu.Unlock()
|
|
|
|
|
2021-01-14 07:54:30 -08:00
|
|
|
processLeave(src)
|
2021-01-06 05:42:55 -08:00
|
|
|
}
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-05 11:34:35 -08:00
|
|
|
break
|
|
|
|
}
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-05 11:34:35 -08:00
|
|
|
log.Print(err)
|
|
|
|
continue
|
|
|
|
}
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-06 14:39:54 -08:00
|
|
|
// Process
|
2021-01-14 08:09:06 -08:00
|
|
|
if processPktCommand(src, dst, &pkt) {
|
2021-01-14 04:40:31 -08:00
|
|
|
continue
|
2021-01-06 14:39:54 -08:00
|
|
|
}
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-06 14:39:54 -08:00
|
|
|
// Forward
|
2021-01-05 11:34:35 -08:00
|
|
|
if _, err := dst.Send(pkt); err != nil {
|
|
|
|
log.Print(err)
|
|
|
|
}
|
|
|
|
}
|
2021-01-09 03:26:30 -08:00
|
|
|
|
2021-01-05 11:34:35 -08:00
|
|
|
dst.SendDisco(0, true)
|
|
|
|
dst.Close()
|
|
|
|
}
|