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  }