client.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package client
  2. import (
  3. "encoding/json"
  4. "github.com/fatedier/frp/models/consts"
  5. "github.com/fatedier/frp/models/msg"
  6. "github.com/fatedier/frp/utils/conn"
  7. "github.com/fatedier/frp/utils/log"
  8. )
  9. type ProxyClient struct {
  10. Name string
  11. Passwd string
  12. LocalPort int64
  13. }
  14. func (p *ProxyClient) GetLocalConn() (c *conn.Conn, err error) {
  15. c = &conn.Conn{}
  16. err = c.ConnectServer("127.0.0.1", p.LocalPort)
  17. if err != nil {
  18. log.Error("ProxyName [%s], connect to local port error, %v", p.Name, err)
  19. }
  20. return
  21. }
  22. func (p *ProxyClient) GetRemoteConn(addr string, port int64) (c *conn.Conn, err error) {
  23. c = &conn.Conn{}
  24. defer func() {
  25. if err != nil {
  26. c.Close()
  27. }
  28. }()
  29. err = c.ConnectServer(addr, port)
  30. if err != nil {
  31. log.Error("ProxyName [%s], connect to server [%s:%d] error, %v", p.Name, addr, port, err)
  32. return
  33. }
  34. req := &msg.ClientCtlReq{
  35. Type: consts.WorkConn,
  36. ProxyName: p.Name,
  37. Passwd: p.Passwd,
  38. }
  39. buf, _ := json.Marshal(req)
  40. err = c.Write(string(buf) + "\n")
  41. if err != nil {
  42. log.Error("ProxyName [%s], write to server error, %v", p.Name, err)
  43. return
  44. }
  45. err = nil
  46. return
  47. }
  48. func (p *ProxyClient) StartTunnel(serverAddr string, serverPort int64) (err error) {
  49. localConn, err := p.GetLocalConn()
  50. if err != nil {
  51. return
  52. }
  53. remoteConn, err := p.GetRemoteConn(serverAddr, serverPort)
  54. if err != nil {
  55. return
  56. }
  57. // l means local, r means remote
  58. log.Debug("Join two conns, (l[%s] r[%s]) (l[%s] r[%s])", localConn.GetLocalAddr(), localConn.GetRemoteAddr(),
  59. remoteConn.GetLocalAddr(), remoteConn.GetRemoteAddr())
  60. go conn.Join(localConn, remoteConn)
  61. return nil
  62. }