main.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. zmostp_go "git.swzry.com/zry/zmostp/zmostp-go"
  7. "net"
  8. "sync"
  9. )
  10. var flagHelp bool
  11. var flagBind string
  12. var LH *LogHandler
  13. func main() {
  14. flag.BoolVar(&flagHelp, "h", false, "print help")
  15. flag.StringVar(&flagBind, "b", ":19810", "bind address")
  16. flag.Parse()
  17. if flagHelp {
  18. flag.PrintDefaults()
  19. return
  20. }
  21. LH = &LogHandler{}
  22. ln, err := net.Listen("tcp", flagBind)
  23. if err != nil {
  24. fmt.Println("Error listening:", err.Error())
  25. return
  26. }
  27. defer ln.Close()
  28. fmt.Println("Listening on ", flagBind)
  29. for {
  30. conn, err := ln.Accept()
  31. if err != nil {
  32. fmt.Println("Error accepting connection:", err.Error())
  33. return
  34. }
  35. fmt.Println("Client connected:", conn.RemoteAddr())
  36. go handleConnection(conn)
  37. }
  38. }
  39. func handleConnection(conn net.Conn) {
  40. defer conn.Close()
  41. dec := zmostp_go.NewReceiver(&zmostp_go.ReceiverConfig{
  42. ByteReader: zmostp_go.NewSimpleByteReader(conn),
  43. EnableCRC: true,
  44. DecodeFailureLog: LH,
  45. })
  46. enc := zmostp_go.NewTransmitter(&zmostp_go.TransmitterConfig{
  47. Writer: conn,
  48. HumanFriendlySending: false,
  49. EnableCRC: true,
  50. })
  51. inch := enc.GetMessageInChannel()
  52. outch := dec.GetMessageOutChannel()
  53. wg := sync.WaitGroup{}
  54. wg.Add(3)
  55. ctx, cncl := context.WithCancel(context.Background())
  56. go func() {
  57. err := enc.Run(ctx)
  58. if err != nil {
  59. fmt.Printf("[ERR] error in encoder of conn '%s': %v\n", conn.RemoteAddr(), err)
  60. } else {
  61. fmt.Printf("[LOG] encoder of conn '%s' done\n", conn.RemoteAddr())
  62. }
  63. cncl()
  64. wg.Done()
  65. }()
  66. go func() {
  67. err := dec.Run(ctx)
  68. if err != nil {
  69. fmt.Printf("[ERR] error in decoder of conn '%s': %v\n", conn.RemoteAddr(), err)
  70. } else {
  71. fmt.Printf("[LOG] decoder of conn '%s' done\n", conn.RemoteAddr())
  72. }
  73. cncl()
  74. wg.Done()
  75. }()
  76. go func() {
  77. for {
  78. select {
  79. case msg := <-outch:
  80. fmt.Printf("[MSG] Recv msg from ch %d: %v\n", msg.Channel, string(msg.Payload))
  81. inch <- msg
  82. case <-ctx.Done():
  83. fmt.Printf("[LOG] logic of conn '%s' done\n", conn.RemoteAddr())
  84. return
  85. }
  86. }
  87. }()
  88. wg.Wait()
  89. cncl()
  90. }