1
0

client.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package client
  2. import (
  3. "github.com/cnlh/easyProxy/utils"
  4. "log"
  5. "net"
  6. "sync"
  7. "time"
  8. )
  9. type TRPClient struct {
  10. svrAddr string
  11. tcpNum int
  12. sync.Mutex
  13. vKey string
  14. }
  15. //new client
  16. func NewRPClient(svraddr string, tcpNum int, vKey string) *TRPClient {
  17. c := new(TRPClient)
  18. c.svrAddr = svraddr
  19. c.tcpNum = tcpNum
  20. c.vKey = vKey
  21. return c
  22. }
  23. //start
  24. func (s *TRPClient) Start() error {
  25. for i := 0; i < s.tcpNum; i++ {
  26. go s.NewConn()
  27. }
  28. return nil
  29. }
  30. //新建
  31. func (s *TRPClient) NewConn() error {
  32. s.Lock()
  33. conn, err := net.Dial("tcp", s.svrAddr)
  34. if err != nil {
  35. log.Println("连接服务端失败,五秒后将重连")
  36. time.Sleep(time.Second * 5)
  37. s.Unlock()
  38. go s.NewConn()
  39. return err
  40. }
  41. s.Unlock()
  42. return s.process(utils.NewConn(conn))
  43. }
  44. //处理
  45. func (s *TRPClient) process(c *utils.Conn) error {
  46. c.SetAlive()
  47. if _, err := c.Write([]byte(utils.Getverifyval(s.vKey))); err != nil {
  48. return err
  49. }
  50. c.WriteMain()
  51. for {
  52. flags, err := c.ReadFlag()
  53. if err != nil {
  54. log.Println("服务端断开,五秒后将重连", err)
  55. time.Sleep(5 * time.Second)
  56. go s.NewConn()
  57. break
  58. }
  59. switch flags {
  60. case utils.VERIFY_EER:
  61. log.Fatalln("vkey:", s.vKey, "不正确,服务端拒绝连接,请检查")
  62. case utils.WORK_CHAN: //隧道模式,每次开启10个,加快连接速度
  63. for i := 0; i < 5; i++ {
  64. go s.dealChan()
  65. }
  66. case utils.RES_MSG:
  67. log.Println("服务端返回错误。")
  68. default:
  69. log.Println("无法解析该错误。", flags)
  70. }
  71. }
  72. return nil
  73. }
  74. //隧道模式处理
  75. func (s *TRPClient) dealChan() {
  76. var err error
  77. //创建一个tcp连接
  78. conn, err := net.Dial("tcp", s.svrAddr)
  79. if err != nil {
  80. log.Println("connect to ", s.svrAddr, "error:", err)
  81. return
  82. }
  83. //验证
  84. if _, err := conn.Write([]byte(utils.Getverifyval(s.vKey))); err != nil {
  85. log.Println("connect to ", s.svrAddr, "error:", err)
  86. return
  87. }
  88. //默认长连接保持
  89. c := utils.NewConn(conn)
  90. c.SetAlive()
  91. //写标志
  92. c.WriteChan()
  93. re:
  94. //获取连接的host type(tcp or udp)
  95. typeStr, host, en, de, crypt, mux, err := c.GetHostFromConn()
  96. if err != nil {
  97. c.Close()
  98. return
  99. }
  100. Process(c, typeStr, host, en, de, crypt, mux)
  101. if mux {
  102. utils.FlushConn(conn)
  103. goto re
  104. } else {
  105. c.Close()
  106. }
  107. }
  108. func Process(c *utils.Conn, typeStr, host string, en, de int, crypt, mux bool) {
  109. //与目标建立连接,超时时间为3
  110. server, err := net.DialTimeout(typeStr, host, time.Second*3)
  111. if err != nil {
  112. log.Println("connect to ", host, "error:", err, mux)
  113. c.WriteFail()
  114. return
  115. }
  116. c.WriteSuccess()
  117. utils.ReplayWaitGroup(c.Conn, server, en, de, crypt, mux)
  118. }