package peer import ( "log" "net" "net/netip" ) type ConnReader struct { Globals conn *net.UDPConn buf []byte } func NewConnReader(g Globals, conn *net.UDPConn) *ConnReader { return &ConnReader{ Globals: g, conn: conn, buf: make([]byte, bufferSize), } } func (r *ConnReader) Run() { for { r.handleNextPacket() } } func (r *ConnReader) handleNextPacket() { buf := r.buf[:bufferSize] n, remoteAddr, err := r.conn.ReadFromUDPAddrPort(buf) if err != nil { log.Fatalf("Failed to read from UDP port: %v", err) } if n < headerSize { return } remoteAddr = netip.AddrPortFrom(remoteAddr.Addr().Unmap(), remoteAddr.Port()) buf = buf[:n] h := parseHeader(buf) remote := r.RemotePeers[h.SourceIP].Load() switch h.StreamID { case controlStreamID: remote.handleControlPacket(h, remoteAddr, buf) case dataStreamID: remote.handleDataPacket(h, buf) default: r.logf("Unknown stream ID: %d", h.StreamID) } } func (r *ConnReader) logf(format string, args ...any) { log.Printf("[ConnReader] "+format, args...) }