|
@@ -54,6 +54,10 @@ func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) err
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return log.Error("Failed to accpet connection: %s", err.Error())
|
|
return log.Error("Failed to accpet connection: %s", err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
+ if tcpConn, ok := connection.(*net.TCPConn); ok {
|
|
|
|
|
+ tcpConn.SetKeepAlive(true)
|
|
|
|
|
+ tcpConn.SetKeepAlivePeriod(4 * time.Second)
|
|
|
|
|
+ }
|
|
|
go handler.HandleConnection(connection)
|
|
go handler.HandleConnection(connection)
|
|
|
}
|
|
}
|
|
|
return nil
|
|
return nil
|
|
@@ -62,18 +66,15 @@ func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) err
|
|
|
func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error {
|
|
func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error {
|
|
|
defer connection.Close()
|
|
defer connection.Close()
|
|
|
|
|
|
|
|
- reader := protocol.NewVMessRequestReader(handler.clients)
|
|
|
|
|
|
|
+ connReader := v2net.NewTimeOutReader(4, connection)
|
|
|
|
|
+ requestReader := protocol.NewVMessRequestReader(handler.clients)
|
|
|
|
|
|
|
|
- // Timeout 4 seconds to prevent DoS attack
|
|
|
|
|
- connection.SetReadDeadline(time.Now().Add(requestReadTimeOut))
|
|
|
|
|
- request, err := reader.Read(connection)
|
|
|
|
|
|
|
+ request, err := requestReader.Read(connReader)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
log.Warning("VMessIn: Invalid request from (%s): %v", connection.RemoteAddr().String(), err)
|
|
log.Warning("VMessIn: Invalid request from (%s): %v", connection.RemoteAddr().String(), err)
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
log.Debug("VMessIn: Received request for %s", request.Address.String())
|
|
log.Debug("VMessIn: Received request for %s", request.Address.String())
|
|
|
- // Clear read timeout
|
|
|
|
|
- connection.SetReadDeadline(zeroTime)
|
|
|
|
|
|
|
|
|
|
ray := handler.vPoint.DispatchToOutbound(v2net.NewTCPPacket(request.Destination()))
|
|
ray := handler.vPoint.DispatchToOutbound(v2net.NewTCPPacket(request.Destination()))
|
|
|
input := ray.InboundInput()
|
|
input := ray.InboundInput()
|
|
@@ -82,7 +83,7 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error
|
|
|
readFinish.Lock()
|
|
readFinish.Lock()
|
|
|
writeFinish.Lock()
|
|
writeFinish.Lock()
|
|
|
|
|
|
|
|
- go handleInput(request, connection, input, &readFinish)
|
|
|
|
|
|
|
+ go handleInput(request, connReader, input, &readFinish)
|
|
|
|
|
|
|
|
responseKey := md5.Sum(request.RequestKey[:])
|
|
responseKey := md5.Sum(request.RequestKey[:])
|
|
|
responseIV := md5.Sum(request.RequestIV[:])
|
|
responseIV := md5.Sum(request.RequestIV[:])
|