Browse Source

add connection read timeout

fatedier 7 years ago
parent
commit
a84dd05351
2 changed files with 19 additions and 1 deletions
  1. 13 1
      client/control.go
  2. 6 0
      server/service.go

+ 13 - 1
client/control.go

@@ -30,6 +30,10 @@ import (
 	"github.com/fatedier/frp/utils/version"
 )
 
+const (
+	connReadTimeout time.Duration = 10 * time.Second
+)
+
 type Control struct {
 	// frpc service
 	svr *Service
@@ -144,7 +148,7 @@ func (ctl *Control) NewWorkConn() {
 
 	// dispatch this work connection to related proxy
 	if pxy, ok := ctl.proxies[startMsg.ProxyName]; ok {
-		workConn.Info("start a new work connection")
+		workConn.Info("start a new work connection, localAddr: %s remoteAddr: %s", workConn.LocalAddr().String(), workConn.RemoteAddr().String())
 		go pxy.InWorkConn(workConn)
 	} else {
 		workConn.Close()
@@ -168,6 +172,12 @@ func (ctl *Control) login() (err error) {
 		return err
 	}
 
+	defer func() {
+		if err != nil {
+			conn.Close()
+		}
+	}()
+
 	now := time.Now().Unix()
 	ctl.loginMsg.PrivilegeKey = util.GetAuthKey(config.ClientCommonCfg.PrivilegeToken, now)
 	ctl.loginMsg.Timestamp = now
@@ -178,9 +188,11 @@ func (ctl *Control) login() (err error) {
 	}
 
 	var loginRespMsg msg.LoginResp
+	conn.SetReadDeadline(time.Now().Add(connReadTimeout))
 	if err = msg.ReadMsgInto(conn, &loginRespMsg); err != nil {
 		return err
 	}
+	conn.SetReadDeadline(time.Time{})
 
 	if loginRespMsg.Error != "" {
 		err = fmt.Errorf("%s", loginRespMsg.Error)

+ 6 - 0
server/service.go

@@ -28,6 +28,10 @@ import (
 	"github.com/fatedier/frp/utils/vhost"
 )
 
+const (
+	connReadTimeout time.Duration = 10 * time.Second
+)
+
 var ServerService *Service
 
 // Server service.
@@ -121,11 +125,13 @@ func (svr *Service) Run() {
 		// Start a new goroutine for dealing connections.
 		go func(frpConn net.Conn) {
 			var rawMsg msg.Message
+			frpConn.SetReadDeadline(time.Now().Add(connReadTimeout))
 			if rawMsg, err = msg.ReadMsg(frpConn); err != nil {
 				log.Warn("Failed to read message: %v", err)
 				frpConn.Close()
 				return
 			}
+			frpConn.SetReadDeadline(time.Time{})
 
 			switch m := rawMsg.(type) {
 			case *msg.Login: