diff --git a/proxy/vmess/vmessin.go b/proxy/vmess/vmessin.go index 5564c66e..9944cdef 100644 --- a/proxy/vmess/vmessin.go +++ b/proxy/vmess/vmessin.go @@ -4,7 +4,6 @@ import ( "crypto/md5" "io" "net" - "strconv" "sync" "time" @@ -40,7 +39,11 @@ func NewVMessInboundHandler(vp *core.Point, clients user.UserSet, udpEnabled boo } func (handler *VMessInboundHandler) Listen(port uint16) error { - listener, err := net.Listen("tcp", ":"+strconv.Itoa(int(port))) + listener, err := net.ListenTCP("tcp", &net.TCPAddr{ + IP: []byte{0, 0, 0, 0}, + Port: int(port), + Zone: "", + }) if err != nil { return log.Error("Unable to listen tcp:%d", port) } @@ -54,9 +57,9 @@ func (handler *VMessInboundHandler) Listen(port uint16) error { return nil } -func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) error { +func (handler *VMessInboundHandler) AcceptConnections(listener *net.TCPListener) error { for handler.accepting { - connection, err := listener.Accept() + connection, err := listener.AcceptTCP() if err != nil { return log.Error("Failed to accpet connection: %s", err.Error()) } @@ -65,7 +68,7 @@ func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) err return nil } -func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error { +func (handler *VMessInboundHandler) HandleConnection(connection *net.TCPConn) error { defer connection.Close() connReader := v2net.NewTimeOutReader(120, connection) @@ -101,14 +104,14 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error if data, open := <-output; open { buffer = append(buffer, data...) + data = nil responseWriter.Write(buffer) + buffer = nil go handleOutput(request, responseWriter, output, &writeFinish) writeFinish.Lock() } - if tcpConn, ok := connection.(*net.TCPConn); ok { - tcpConn.CloseWrite() - } + connection.CloseWrite() readFinish.Lock() return nil