2021-01-05 11:34:35 -08:00
|
|
|
package multiserver
|
|
|
|
|
|
|
|
import "log"
|
|
|
|
|
|
|
|
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 04:40:31 -08:00
|
|
|
if processPktCommand(src, pkt) {
|
|
|
|
continue
|
2021-01-06 14:39:54 -08:00
|
|
|
}
|
2021-01-08 11:03:41 -08:00
|
|
|
// Active object remove add
|
|
|
|
if pkt.Data[0] == uint8(0x00) && pkt.Data[1] == uint8(0x31) && src.IsSrv() {
|
2021-01-10 07:45:13 -08:00
|
|
|
pkt.Data = processAORmAdd(dst, pkt.Data)
|
2021-01-08 11:03:41 -08:00
|
|
|
}
|
2021-01-10 11:18:12 -08:00
|
|
|
// Client ready
|
|
|
|
if pkt.Data[0] == uint8(0x00) && pkt.Data[1] == uint8(0x43) && !src.IsSrv() {
|
2021-01-14 07:54:30 -08:00
|
|
|
go processJoin(src)
|
2021-01-10 11:18:12 -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()
|
|
|
|
}
|