base.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package proxy
  2. import (
  3. "errors"
  4. "github.com/cnlh/nps/bridge"
  5. "github.com/cnlh/nps/lib/common"
  6. "github.com/cnlh/nps/lib/conn"
  7. "github.com/cnlh/nps/lib/file"
  8. "net"
  9. "net/http"
  10. "sync"
  11. )
  12. type Service interface {
  13. Start() error
  14. Close() error
  15. }
  16. //Server BaseServer struct
  17. type BaseServer struct {
  18. id int
  19. bridge *bridge.Bridge
  20. task *file.Tunnel
  21. errorContent []byte
  22. sync.Mutex
  23. }
  24. func NewBaseServer(bridge *bridge.Bridge, task *file.Tunnel) *BaseServer {
  25. return &BaseServer{
  26. bridge: bridge,
  27. task: task,
  28. errorContent: nil,
  29. Mutex: sync.Mutex{},
  30. }
  31. }
  32. func (s *BaseServer) FlowAdd(in, out int64) {
  33. s.Lock()
  34. defer s.Unlock()
  35. s.task.Flow.ExportFlow += out
  36. s.task.Flow.InletFlow += in
  37. }
  38. func (s *BaseServer) FlowAddHost(host *file.Host, in, out int64) {
  39. s.Lock()
  40. defer s.Unlock()
  41. host.Flow.ExportFlow += out
  42. host.Flow.InletFlow += in
  43. }
  44. func (s *BaseServer) writeConnFail(c net.Conn) {
  45. c.Write([]byte(common.ConnectionFailBytes))
  46. c.Write(s.errorContent)
  47. }
  48. //权限认证
  49. func (s *BaseServer) auth(r *http.Request, c *conn.Conn, u, p string) error {
  50. if u != "" && p != "" && !common.CheckAuth(r, u, p) {
  51. c.Write([]byte(common.UnauthorizedBytes))
  52. c.Close()
  53. return errors.New("401 Unauthorized")
  54. }
  55. return nil
  56. }
  57. func (s *BaseServer) checkFlow() error {
  58. if s.task.Client.Flow.FlowLimit > 0 && (s.task.Client.Flow.FlowLimit<<20) < (s.task.Client.Flow.ExportFlow+s.task.Client.Flow.InletFlow) {
  59. return errors.New("Traffic exceeded")
  60. }
  61. return nil
  62. }
  63. //与客户端建立通道
  64. func (s *BaseServer) DealClient(c *conn.Conn, addr string, rb []byte, tp string) error {
  65. link := conn.NewLink(tp, addr, s.task.Client.Cnf.Crypt, s.task.Client.Cnf.Compress, c.Conn.RemoteAddr().String())
  66. if target, err := s.bridge.SendLinkInfo(s.task.Client.Id, link, c.Conn.RemoteAddr().String()); err != nil {
  67. c.Close()
  68. return err
  69. } else {
  70. conn.CopyWaitGroup(target, c, link.Crypt, link.Compress, s.task.Client.Rate, s.task.Client.Flow)
  71. }
  72. s.task.Client.AddConn()
  73. return nil
  74. }