|
|
@@ -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
|