control.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package main
  2. import (
  3. "encoding/json"
  4. "io"
  5. "sync"
  6. "time"
  7. "frp/pkg/models"
  8. "frp/pkg/utils/conn"
  9. "frp/pkg/utils/log"
  10. )
  11. // 重连时的间隔时间区间
  12. const (
  13. sleepMinDuration = 1
  14. sleepMaxDuration = 60
  15. )
  16. func ControlProcess(cli *models.ProxyClient, wait *sync.WaitGroup) {
  17. defer wait.Done()
  18. c := loginToServer(cli)
  19. if c == nil {
  20. log.Error("ProxyName [%s], connect to server failed!", cli.Name)
  21. return
  22. }
  23. defer c.Close()
  24. for {
  25. // ignore response content now
  26. _, err := c.ReadLine()
  27. if err == io.EOF {
  28. // reconnect when disconnect
  29. log.Debug("ProxyName [%s], server close this control conn", cli.Name)
  30. var sleepTime time.Duration = 1
  31. for {
  32. log.Debug("ProxyName [%s], try to reconnect to server[%s:%d]...", cli.Name, ServerAddr, ServerPort)
  33. tmpConn := loginToServer(cli)
  34. if tmpConn != nil {
  35. c.Close()
  36. c = tmpConn
  37. break
  38. }
  39. if sleepTime < 60 {
  40. sleepTime++
  41. }
  42. time.Sleep(sleepTime * time.Second)
  43. }
  44. continue
  45. } else if err != nil {
  46. log.Warn("ProxyName [%s], read from server error, %v", cli.Name, err)
  47. continue
  48. }
  49. cli.StartTunnel(ServerAddr, ServerPort)
  50. }
  51. }
  52. func loginToServer(cli *models.ProxyClient) (connection *conn.Conn) {
  53. c := &conn.Conn{}
  54. connection = nil
  55. for i := 0; i < 1; i++ { // ZWF: 此处的for作为控制流使用
  56. err := c.ConnectServer(ServerAddr, ServerPort)
  57. if err != nil {
  58. log.Error("ProxyName [%s], connect to server [%s:%d] error, %v", cli.Name, ServerAddr, ServerPort, err)
  59. break
  60. }
  61. req := &models.ClientCtlReq{
  62. Type: models.ControlConn,
  63. ProxyName: cli.Name,
  64. Passwd: cli.Passwd,
  65. }
  66. buf, _ := json.Marshal(req)
  67. err = c.Write(string(buf) + "\n")
  68. if err != nil {
  69. log.Error("ProxyName [%s], write to server error, %v", cli.Name, err)
  70. break
  71. }
  72. res, err := c.ReadLine()
  73. if err != nil {
  74. log.Error("ProxyName [%s], read from server error, %v", cli.Name, err)
  75. break
  76. }
  77. log.Debug("ProxyName [%s], read [%s]", cli.Name, res)
  78. clientCtlRes := &models.ClientCtlRes{}
  79. if err = json.Unmarshal([]byte(res), &clientCtlRes); err != nil {
  80. log.Error("ProxyName [%s], format server response error, %v", cli.Name, err)
  81. break
  82. }
  83. if clientCtlRes.Code != 0 {
  84. log.Error("ProxyName [%s], start proxy error, %s", cli.Name, clientCtlRes.Msg)
  85. break
  86. }
  87. connection = c
  88. }
  89. if connection == nil {
  90. c.Close()
  91. }
  92. return
  93. }