client.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package lib
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "net"
  7. "sync"
  8. "time"
  9. )
  10. type TRPClient struct {
  11. svrAddr string
  12. tcpNum int
  13. sync.Mutex
  14. vKey string
  15. }
  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. func (s *TRPClient) Start() error {
  24. for i := 0; i < s.tcpNum; i++ {
  25. go s.newConn()
  26. }
  27. return nil
  28. }
  29. //新建
  30. func (s *TRPClient) newConn() error {
  31. s.Lock()
  32. conn, err := net.Dial("tcp", s.svrAddr)
  33. if err != nil {
  34. log.Println("连接服务端失败,五秒后将重连")
  35. time.Sleep(time.Second * 5)
  36. s.Unlock()
  37. go s.newConn()
  38. return err
  39. }
  40. s.Unlock()
  41. return s.process(NewConn(conn))
  42. }
  43. func (s *TRPClient) process(c *Conn) error {
  44. c.SetAlive()
  45. if _, err := c.Write([]byte(getverifyval(s.vKey))); err != nil {
  46. return err
  47. }
  48. c.wMain()
  49. for {
  50. flags, err := c.ReadFlag()
  51. if err != nil {
  52. log.Println("服务端断开,五秒后将重连", err)
  53. time.Sleep(5 * time.Second)
  54. go s.newConn()
  55. break
  56. }
  57. switch flags {
  58. case VERIFY_EER:
  59. log.Fatalln("vkey:", s.vKey, "不正确,服务端拒绝连接,请检查")
  60. case RES_SIGN: //代理请求模式
  61. if err := s.dealHttp(c); err != nil {
  62. log.Println(err)
  63. return err
  64. }
  65. case WORK_CHAN: //隧道模式,每次开启10个,加快连接速度
  66. for i := 0; i < 10; i++ {
  67. go s.dealChan()
  68. }
  69. case RES_MSG:
  70. log.Println("服务端返回错误。")
  71. default:
  72. log.Println("无法解析该错误。", flags)
  73. }
  74. }
  75. return nil
  76. }
  77. //隧道模式处理
  78. func (s *TRPClient) dealChan() error {
  79. //创建一个tcp连接
  80. conn, err := net.Dial("tcp", s.svrAddr)
  81. if err != nil {
  82. log.Println("connect to ", s.svrAddr, "error:", err)
  83. return err
  84. }
  85. //验证
  86. if _, err := conn.Write([]byte(getverifyval(s.vKey))); err != nil {
  87. log.Println("connect to ", s.svrAddr, "error:", err)
  88. return err
  89. }
  90. //默认长连接保持
  91. c := NewConn(conn)
  92. c.SetAlive()
  93. //写标志
  94. c.wChan()
  95. //获取连接的host type(tcp or udp)
  96. typeStr, host, en, de, crypt, err := c.GetHostFromConn()
  97. if err != nil {
  98. log.Println("get host info error:", err)
  99. return err
  100. }
  101. //与目标建立连接
  102. server, err := net.Dial(typeStr, host)
  103. if err != nil {
  104. log.Println("connect to ", host, "error:", err)
  105. return err
  106. }
  107. go relay(NewConn(server), c, de, crypt)
  108. relay(c, NewConn(server), en, crypt)
  109. return nil
  110. }
  111. //http模式处理
  112. func (s *TRPClient) dealHttp(c *Conn) error {
  113. buf := make([]byte, 1024*32)
  114. en, de, _ := c.GetConnInfoFromConn()
  115. n, err := c.ReadFromCompress(buf, de)
  116. if err != nil {
  117. c.wError()
  118. return err
  119. }
  120. req, err := DecodeRequest(buf[:n])
  121. if err != nil {
  122. c.wError()
  123. return err
  124. }
  125. respBytes, err := GetEncodeResponse(req)
  126. if err != nil {
  127. c.wError()
  128. return err
  129. }
  130. c.wSign()
  131. n, err = c.WriteCompress(respBytes, en)
  132. if err != nil {
  133. return err
  134. }
  135. if n != len(respBytes) {
  136. return errors.New(fmt.Sprintf("发送数据长度错误,已经发送:%dbyte,总字节长:%dbyte\n", n, len(respBytes)))
  137. }
  138. return nil
  139. }