diff --git a/net/vmess/vmessin.go b/net/vmess/vmessin.go index ef9b9ceaa..ac6f2a38f 100644 --- a/net/vmess/vmessin.go +++ b/net/vmess/vmessin.go @@ -77,24 +77,18 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error if err != nil { return log.Error("Failed to create encrypt writer: %v", err) } - //responseWriter.Write(response[:]) // Optimize for small response packet buffer := make([]byte, 0, 1024) buffer = append(buffer, response[:]...) - data, open := <-output - if open { + + if data, open := <-output; open { buffer = append(buffer, data...) + responseWriter.Write(buffer) + go handleOutput(request, responseWriter, output, writeFinish) + <-writeFinish } - responseWriter.Write(buffer) - - if open { - go handleOutput(request, responseWriter, output, writeFinish) - } else { - close(writeFinish) - } - - <-writeFinish + if tcpConn, ok := connection.(*net.TCPConn); ok { log.Debug("VMessIn closing write") tcpConn.CloseWrite() diff --git a/net/vmess/vmessout.go b/net/vmess/vmessout.go index 19552128f..eb95bc92e 100644 --- a/net/vmess/vmessout.go +++ b/net/vmess/vmessout.go @@ -108,23 +108,20 @@ func handleRequest(conn *net.TCPConn, request *vmessio.VMessRequest, input <-cha if err != nil { log.Error("VMessOut: Failed to serialize VMess request: %v", err) } - //conn.Write(buffer) - data, open := <-input + + // Send first packet of payload together with request, in favor of small requests. + payload, open := <-input if open { - encryptRequestWriter.Crypt(data) - buffer = append(buffer, data...) + encryptRequestWriter.Crypt(payload) + buffer = append(buffer, payload...) + + _, err = conn.Write(buffer) + if err != nil { + log.Error("VMessOut: Failed to write VMess request: %v", err) + } + + v2net.ChanToWriter(encryptRequestWriter, input) } - - _, err = conn.Write(buffer) - if err != nil { - log.Error("VMessOut: Failed to write VMess request: %v", err) - } - - if !open { - return nil - } - - v2net.ChanToWriter(encryptRequestWriter, input) return nil }