1
0

ForwardServer.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package Service
  2. import (
  3. "fmt"
  4. "forward-core/Models"
  5. "net"
  6. "sync"
  7. "github.com/astaxie/beego/logs"
  8. )
  9. type ForWardServer struct {
  10. JobMap map[string]*ForWardJob
  11. JobMapLock sync.Mutex
  12. }
  13. func NewForWardServer() *ForWardServer {
  14. return &ForWardServer{
  15. JobMap: make(map[string]*ForWardJob, 200),
  16. }
  17. }
  18. func (_self *ForWardServer) FindAllForward() []*Models.ForwardInfo {
  19. var forwardList []*Models.ForwardInfo
  20. for _, forWardJob := range _self.JobMap {
  21. forwardInfo := new(Models.ForwardInfo)
  22. forwardInfo.Name = forWardJob.Config.Name
  23. forwardInfo.Status = forWardJob.Status
  24. forwardInfo.Protocol = forWardJob.Config.Protocol
  25. forwardInfo.SrcAddr = forWardJob.Config.SrcAddr
  26. forwardInfo.SrcPort = forWardJob.Config.SrcPort
  27. forwardInfo.DestAddr = forWardJob.Config.DestAddr
  28. forwardInfo.DestPort = forWardJob.Config.DestPort
  29. if forWardJob.IsUdpJob() {
  30. for key, _ := range forWardJob.UdpForwardJob.UdpConns {
  31. forwardInfo.Clients = append(forwardInfo.Clients, key)
  32. }
  33. } else {
  34. for _, client := range forWardJob.ClientMap {
  35. forwardInfo.Clients = append(forwardInfo.Clients, client.SrcConn.RemoteAddr().String())
  36. }
  37. }
  38. forwardInfo.OnlineCount = len(forwardInfo.Clients)
  39. forwardList = append(forwardList, forwardInfo)
  40. }
  41. return forwardList
  42. }
  43. func (_self *ForWardServer) GetForwardInfo(config *Models.ForwardConfig) *Models.ForwardInfo {
  44. forwardInfo := new(Models.ForwardInfo)
  45. forWardJob := _self.GetRegistryJob(config)
  46. if forWardJob != nil {
  47. forwardInfo.Name = forWardJob.Config.Name
  48. forwardInfo.Status = forWardJob.Status
  49. forwardInfo.Protocol = forWardJob.Config.Protocol
  50. forwardInfo.SrcAddr = forWardJob.Config.SrcAddr
  51. forwardInfo.SrcPort = forWardJob.Config.SrcPort
  52. forwardInfo.DestAddr = forWardJob.Config.DestAddr
  53. forwardInfo.DestPort = forWardJob.Config.DestPort
  54. for _, client := range forWardJob.ClientMap {
  55. forwardInfo.Clients = append(forwardInfo.Clients, client.SrcConn.RemoteAddr().String())
  56. }
  57. forwardInfo.OnlineCount = len(forwardInfo.Clients)
  58. }
  59. return forwardInfo
  60. }
  61. func (_self *ForWardServer) GetForwardJob(config *Models.ForwardConfig) *ForWardJob {
  62. return _self.GetRegistryJob(config)
  63. }
  64. func (_self *ForWardServer) OpenForward(config *Models.ForwardConfig, result chan Models.FuncResult) {
  65. forWardJob := new(ForWardJob)
  66. forWardJob.ClientMap = make(map[string]*ForWardClient, 500)
  67. forWardJob.Config = config
  68. forWardJob.UdpForwardJob = NewUdpForward()
  69. go forWardJob.StartJob(result)
  70. _self.RegistryJob(config, forWardJob)
  71. }
  72. func (_self *ForWardServer) GetJobKey(config *Models.ForwardConfig) string {
  73. srcAddr := fmt.Sprint(config.SrcAddr, ":", config.SrcPort)
  74. destAddr := fmt.Sprint(config.DestAddr, ":", config.DestPort)
  75. return fmt.Sprint(srcAddr, "_", config.Protocol, "_", destAddr)
  76. }
  77. func (_self *ForWardServer) GetClientId(conn net.Conn) string {
  78. return conn.RemoteAddr().String()
  79. }
  80. func (_self *ForWardServer) RegistryJob(config *Models.ForwardConfig, forWardJob *ForWardJob) {
  81. _self.JobMapLock.Lock()
  82. defer _self.JobMapLock.Unlock()
  83. _self.JobMap[_self.GetJobKey(config)] = forWardJob
  84. }
  85. func (_self *ForWardServer) UnRegistryJob(config *Models.ForwardConfig) {
  86. _self.JobMapLock.Lock()
  87. defer _self.JobMapLock.Unlock()
  88. key := _self.GetJobKey(config)
  89. delete(_self.JobMap, key)
  90. if ForWardDebug == true {
  91. logs.Debug("UnRegistryClient key: ", key)
  92. }
  93. }
  94. func (_self *ForWardServer) GetRegistryJob(config *Models.ForwardConfig) *ForWardJob {
  95. if forWardJob, ok := _self.JobMap[_self.GetJobKey(config)]; ok {
  96. return forWardJob
  97. }
  98. return nil
  99. }
  100. func (_self *ForWardServer) CloseForward(config *Models.ForwardConfig) {
  101. forWardJob := _self.GetRegistryJob(config)
  102. if forWardJob != nil {
  103. logs.Debug("停止转发,找到执行者:", _self.GetJobKey(config))
  104. forWardJob.StopJob()
  105. _self.UnRegistryJob(config)
  106. }
  107. }
  108. func (_self *ForWardServer) CloseAllForward() {
  109. for _, forWardJob := range _self.JobMap {
  110. forWardJob.StopJob()
  111. //delete(_self.JobMap, key)
  112. _self.UnRegistryJob(forWardJob.Config)
  113. }
  114. //_self.JobMap = nil
  115. _self.JobMap = make(map[string]*ForWardJob, 200)
  116. }
粤ICP备19079148号