client.go 1.5 KB

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