echoserver.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package echoserver
  2. import (
  3. "fmt"
  4. "net"
  5. "strings"
  6. fnet "github.com/fatedier/frp/utils/net"
  7. )
  8. type ServerType string
  9. const (
  10. TCP ServerType = "tcp"
  11. UDP ServerType = "udp"
  12. Unix ServerType = "unix"
  13. )
  14. type Options struct {
  15. Type ServerType
  16. BindAddr string
  17. BindPort int32
  18. RepeatNum int
  19. SpecifiedResponse string
  20. }
  21. type Server struct {
  22. opt Options
  23. l net.Listener
  24. }
  25. func New(opt Options) *Server {
  26. if opt.Type == "" {
  27. opt.Type = TCP
  28. }
  29. if opt.BindAddr == "" {
  30. opt.BindAddr = "127.0.0.1"
  31. }
  32. if opt.RepeatNum <= 0 {
  33. opt.RepeatNum = 1
  34. }
  35. return &Server{
  36. opt: opt,
  37. }
  38. }
  39. func (s *Server) GetOptions() Options {
  40. return s.opt
  41. }
  42. func (s *Server) Run() error {
  43. if err := s.initListener(); err != nil {
  44. return err
  45. }
  46. go func() {
  47. for {
  48. c, err := s.l.Accept()
  49. if err != nil {
  50. return
  51. }
  52. go s.handle(c)
  53. }
  54. }()
  55. return nil
  56. }
  57. func (s *Server) Close() error {
  58. if s.l != nil {
  59. return s.l.Close()
  60. }
  61. return nil
  62. }
  63. func (s *Server) initListener() (err error) {
  64. switch s.opt.Type {
  65. case TCP:
  66. s.l, err = net.Listen("tcp", fmt.Sprintf("%s:%d", s.opt.BindAddr, s.opt.BindPort))
  67. case UDP:
  68. s.l, err = fnet.ListenUDP(s.opt.BindAddr, int(s.opt.BindPort))
  69. case Unix:
  70. s.l, err = net.Listen("unix", s.opt.BindAddr)
  71. default:
  72. return fmt.Errorf("unknown server type: %s", s.opt.Type)
  73. }
  74. if err != nil {
  75. return
  76. }
  77. return nil
  78. }
  79. func (s *Server) handle(c net.Conn) {
  80. defer c.Close()
  81. buf := make([]byte, 2048)
  82. for {
  83. n, err := c.Read(buf)
  84. if err != nil {
  85. return
  86. }
  87. var response string
  88. if len(s.opt.SpecifiedResponse) > 0 {
  89. response = s.opt.SpecifiedResponse
  90. } else {
  91. response = strings.Repeat(string(buf[:n]), s.opt.RepeatNum)
  92. }
  93. c.Write([]byte(response))
  94. }
  95. }