client.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. return err
  83. }
  84. //验证
  85. if _, err := conn.Write([]byte(getverifyval(s.vKey))); err != nil {
  86. return err
  87. }
  88. //默认长连接保持
  89. c := NewConn(conn)
  90. c.SetAlive()
  91. //写标志
  92. c.wChan()
  93. //获取连接的host type(tcp or udp)
  94. typeStr, host, en, de, err := c.GetHostFromConn()
  95. if err != nil {
  96. return err
  97. }
  98. //与目标建立连接
  99. server, err := net.Dial(typeStr, host)
  100. if err != nil {
  101. log.Println(err)
  102. return err
  103. }
  104. go relay(NewConn(server), c, de)
  105. relay(c, NewConn(server), en)
  106. return nil
  107. }
  108. //http模式处理
  109. func (s *TRPClient) dealHttp(c *Conn) error {
  110. buf := make([]byte, 1024*32)
  111. en, de := c.GetCompressTypeFromConn()
  112. n, err := c.ReadFromCompress(buf, de)
  113. if err != nil {
  114. c.wError()
  115. return err
  116. }
  117. req, err := DecodeRequest(buf[:n])
  118. if err != nil {
  119. c.wError()
  120. return err
  121. }
  122. respBytes, err := GetEncodeResponse(req)
  123. if err != nil {
  124. c.wError()
  125. return err
  126. }
  127. c.wSign()
  128. n, err = c.WriteCompress(respBytes, en)
  129. if err != nil {
  130. return err
  131. }
  132. if n != len(respBytes) {
  133. return errors.New(fmt.Sprintf("发送数据长度错误,已经发送:%dbyte,总字节长:%dbyte\n", n, len(respBytes)))
  134. }
  135. return nil
  136. }