echo_server.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package mock
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "os"
  7. "syscall"
  8. frpNet "github.com/fatedier/frp/utils/net"
  9. )
  10. type EchoServer struct {
  11. l net.Listener
  12. port int
  13. repeatedNum int
  14. specifyStr string
  15. }
  16. func NewEchoServer(port int, repeatedNum int, specifyStr string) *EchoServer {
  17. if repeatedNum <= 0 {
  18. repeatedNum = 1
  19. }
  20. return &EchoServer{
  21. port: port,
  22. repeatedNum: repeatedNum,
  23. specifyStr: specifyStr,
  24. }
  25. }
  26. func (es *EchoServer) Start() error {
  27. l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", es.port))
  28. if err != nil {
  29. fmt.Printf("echo server listen error: %v\n", err)
  30. return err
  31. }
  32. es.l = l
  33. go func() {
  34. for {
  35. c, err := l.Accept()
  36. if err != nil {
  37. return
  38. }
  39. go echoWorker(c, es.repeatedNum, es.specifyStr)
  40. }
  41. }()
  42. return nil
  43. }
  44. func (es *EchoServer) Stop() {
  45. es.l.Close()
  46. }
  47. func StartUDPEchoServer(port int) {
  48. l, err := frpNet.ListenUDP("127.0.0.1", port)
  49. if err != nil {
  50. fmt.Printf("udp echo server listen error: %v\n", err)
  51. return
  52. }
  53. for {
  54. c, err := l.Accept()
  55. if err != nil {
  56. fmt.Printf("udp echo server accept error: %v\n", err)
  57. return
  58. }
  59. go echoWorker(c, 1, "")
  60. }
  61. }
  62. func StartUnixDomainServer(unixPath string) {
  63. os.Remove(unixPath)
  64. syscall.Umask(0)
  65. l, err := net.Listen("unix", unixPath)
  66. if err != nil {
  67. fmt.Printf("unix domain server listen error: %v\n", err)
  68. return
  69. }
  70. for {
  71. c, err := l.Accept()
  72. if err != nil {
  73. fmt.Printf("unix domain server accept error: %v\n", err)
  74. return
  75. }
  76. go echoWorker(c, 1, "")
  77. }
  78. }
  79. func echoWorker(c net.Conn, repeatedNum int, specifyStr string) {
  80. buf := make([]byte, 2048)
  81. for {
  82. n, err := c.Read(buf)
  83. if err != nil {
  84. if err == io.EOF {
  85. c.Close()
  86. break
  87. } else {
  88. fmt.Printf("echo server read error: %v\n", err)
  89. return
  90. }
  91. }
  92. if specifyStr != "" {
  93. c.Write([]byte(specifyStr))
  94. } else {
  95. var w []byte
  96. for i := 0; i < repeatedNum; i++ {
  97. w = append(w, buf[:n]...)
  98. }
  99. c.Write(w)
  100. }
  101. }
  102. }