LnUDP *net.UDPConn
LnTCP *net.TCPListener
Peers = make(map[string]chan udpobfs.Buf)
+ PeersM sync.RWMutex
Bufs = sync.Pool{New: func() any { return new([udpobfs.BufLen]byte) }}
)
}
cryptoState := udpobfs.NewCryptoState(seed, false)
txs := make(chan udpobfs.Buf)
+ PeersM.Lock()
+ Peers[remoteAddr.String()] = txs
+ PeersM.Unlock()
txFinished := make(chan struct{})
var rxPkts, txPkts, rxBytes, txBytes int64
go func() {
buf := make([]byte, udpobfs.BufLen)
var tx udpobfs.Buf
var got []byte
+ var ok bool
for {
select {
case <-txFinished:
localUDP.Close()
return
}
- case tx = <-txs:
- if tx.Buf == nil {
- break
+ case tx, ok = <-txs:
+ if !ok {
+ return
}
if tx.N < udpobfs.SeqLen {
logger.Warn("too short")
}
}
}()
- Peers[remoteAddr.String()] = txs
go func() {
buf := make([]byte, 8)
for {
"rxBytes", rxBytes,
"txPkts", txPkts,
"txBytes", txBytes)
+ PeersM.Lock()
delete(Peers, remoteAddr.String())
- txs <- udpobfs.Buf{Buf: nil}
- go func() {
- for range txs {
- }
- }()
+ PeersM.Unlock()
+ close(txs)
}
func main() {
if n == 0 {
continue
}
+ PeersM.RLock()
txs = Peers[from.String()]
if txs != nil {
txs <- udpobfs.Buf{Buf: buf, N: n}
}
+ PeersM.RUnlock()
}
}()