(1)新增client向server发送心跳检测

This commit is contained in:
Hurricanezwf 2016-02-04 11:29:04 +08:00
parent f065562ec3
commit af6fc61537

View File

@ -11,12 +11,13 @@ import (
"frp/pkg/utils/log" "frp/pkg/utils/log"
) )
// 重连时的间隔时间区间
const ( const (
sleepMinDuration = 1 heartbeatDuration = 2 //心跳检测时间间隔,单位秒
sleepMaxDuration = 60
) )
// client与server之间连接的保护锁
var connProtect sync.Mutex
func ControlProcess(cli *models.ProxyClient, wait *sync.WaitGroup) { func ControlProcess(cli *models.ProxyClient, wait *sync.WaitGroup) {
defer wait.Done() defer wait.Done()
@ -27,11 +28,13 @@ func ControlProcess(cli *models.ProxyClient, wait *sync.WaitGroup) {
} }
defer c.Close() defer c.Close()
go startHeartBeat(c)
for { for {
// ignore response content now // ignore response content now
_, err := c.ReadLine() _, err := c.ReadLine()
if err == io.EOF { if err == io.EOF {
// reconnect when disconnect connProtect.Lock() // 除了这里,其他地方禁止对连接进行任何操作
log.Debug("ProxyName [%s], server close this control conn", cli.Name) log.Debug("ProxyName [%s], server close this control conn", cli.Name)
var sleepTime time.Duration = 1 var sleepTime time.Duration = 1
for { for {
@ -48,6 +51,7 @@ func ControlProcess(cli *models.ProxyClient, wait *sync.WaitGroup) {
} }
time.Sleep(sleepTime * time.Second) time.Sleep(sleepTime * time.Second)
} }
connProtect.Unlock()
continue continue
} else if err != nil { } else if err != nil {
log.Warn("ProxyName [%s], read from server error, %v", cli.Name, err) log.Warn("ProxyName [%s], read from server error, %v", cli.Name, err)
@ -108,3 +112,16 @@ func loginToServer(cli *models.ProxyClient) (connection *conn.Conn) {
return return
} }
func startHeartBeat(con *conn.Conn) {
for {
time.Sleep(heartbeatDuration * time.Second)
connProtect.Lock()
err := con.Write("\r\n")
connProtect.Unlock()
if err != nil {
log.Error("Send hearbeat to server failed! Err:%s", err.Error())
}
}
}