server.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package server
  2. import (
  3. "fmt"
  4. "net"
  5. libnet "github.com/fatedier/frp/pkg/util/net"
  6. )
  7. type ServerType string
  8. const (
  9. TCP ServerType = "tcp"
  10. UDP ServerType = "udp"
  11. Unix ServerType = "unix"
  12. )
  13. type Server struct {
  14. netType ServerType
  15. bindAddr string
  16. bindPort int
  17. respContent []byte
  18. bufSize int64
  19. echoMode bool
  20. l net.Listener
  21. }
  22. type Option func(*Server) *Server
  23. func New(netType ServerType, options ...Option) *Server {
  24. s := &Server{
  25. netType: netType,
  26. bindAddr: "127.0.0.1",
  27. bufSize: 2048,
  28. }
  29. for _, option := range options {
  30. s = option(s)
  31. }
  32. return s
  33. }
  34. func WithBindAddr(addr string) Option {
  35. return func(s *Server) *Server {
  36. s.bindAddr = addr
  37. return s
  38. }
  39. }
  40. func WithBindPort(port int) Option {
  41. return func(s *Server) *Server {
  42. s.bindPort = port
  43. return s
  44. }
  45. }
  46. func WithRespContent(content []byte) Option {
  47. return func(s *Server) *Server {
  48. s.respContent = content
  49. return s
  50. }
  51. }
  52. func WithBufSize(bufSize int64) Option {
  53. return func(s *Server) *Server {
  54. s.bufSize = bufSize
  55. return s
  56. }
  57. }
  58. func WithEchoMode(echoMode bool) Option {
  59. return func(s *Server) *Server {
  60. s.echoMode = echoMode
  61. return s
  62. }
  63. }
  64. func (s *Server) Run() error {
  65. if err := s.initListener(); err != nil {
  66. return err
  67. }
  68. go func() {
  69. for {
  70. c, err := s.l.Accept()
  71. if err != nil {
  72. return
  73. }
  74. go s.handle(c)
  75. }
  76. }()
  77. return nil
  78. }
  79. func (s *Server) Close() error {
  80. if s.l != nil {
  81. return s.l.Close()
  82. }
  83. return nil
  84. }
  85. func (s *Server) initListener() (err error) {
  86. switch s.netType {
  87. case TCP:
  88. s.l, err = net.Listen("tcp", fmt.Sprintf("%s:%d", s.bindAddr, s.bindPort))
  89. case UDP:
  90. s.l, err = libnet.ListenUDP(s.bindAddr, s.bindPort)
  91. case Unix:
  92. s.l, err = net.Listen("unix", s.bindAddr)
  93. default:
  94. return fmt.Errorf("unknown server type: %s", s.netType)
  95. }
  96. return err
  97. }
  98. func (s *Server) handle(c net.Conn) {
  99. defer c.Close()
  100. buf := make([]byte, s.bufSize)
  101. for {
  102. n, err := c.Read(buf)
  103. if err != nil {
  104. return
  105. }
  106. if s.echoMode {
  107. c.Write(buf[:n])
  108. } else {
  109. c.Write(s.respContent)
  110. }
  111. }
  112. }
  113. func (s *Server) BindAddr() string {
  114. return s.bindAddr
  115. }
  116. func (s *Server) BindPort() int {
  117. return s.bindPort
  118. }