multiserver/proxy.go

58 lines
993 B
Go
Raw Normal View History

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() {
pkt.Data = processAORmAdd(dst, pkt.Data)
2021-01-08 11:03:41 -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-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()
}