github.com/inazumav/sing-box@v0.0.0-20230926072359-ab51429a14f1/transport/hysteria2/client_paclet.go (about) 1 package hysteria2 2 3 import E "github.com/sagernet/sing/common/exceptions" 4 5 func (c *Client) loopMessages(conn *clientQUICConnection) { 6 for { 7 message, err := conn.quicConn.ReceiveMessage(c.ctx) 8 if err != nil { 9 conn.closeWithError(E.Cause(err, "receive message")) 10 return 11 } 12 go func() { 13 hErr := c.handleMessage(conn, message) 14 if hErr != nil { 15 conn.closeWithError(E.Cause(hErr, "handle message")) 16 } 17 }() 18 } 19 } 20 21 func (c *Client) handleMessage(conn *clientQUICConnection, data []byte) error { 22 message := udpMessagePool.Get().(*udpMessage) 23 err := decodeUDPMessage(message, data) 24 if err != nil { 25 message.release() 26 return E.Cause(err, "decode UDP message") 27 } 28 conn.handleUDPMessage(message) 29 return nil 30 } 31 32 func (c *clientQUICConnection) handleUDPMessage(message *udpMessage) { 33 c.udpAccess.RLock() 34 udpConn, loaded := c.udpConnMap[message.sessionID] 35 c.udpAccess.RUnlock() 36 if !loaded { 37 message.releaseMessage() 38 return 39 } 40 select { 41 case <-udpConn.ctx.Done(): 42 message.releaseMessage() 43 return 44 default: 45 } 46 udpConn.inputPacket(message) 47 }