12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package main
- import (
- "context"
- "flag"
- "fmt"
- zmostp_go "git.swzry.com/zry/zmostp/zmostp-go"
- "net"
- "sync"
- )
- var flagHelp bool
- var flagBind string
- var LH *LogHandler
- func main() {
- flag.BoolVar(&flagHelp, "h", false, "print help")
- flag.StringVar(&flagBind, "b", ":19810", "bind address")
- flag.Parse()
- if flagHelp {
- flag.PrintDefaults()
- return
- }
- LH = &LogHandler{}
- ln, err := net.Listen("tcp", flagBind)
- if err != nil {
- fmt.Println("Error listening:", err.Error())
- return
- }
- defer ln.Close()
- fmt.Println("Listening on ", flagBind)
- for {
- conn, err := ln.Accept()
- if err != nil {
- fmt.Println("Error accepting connection:", err.Error())
- return
- }
- fmt.Println("Client connected:", conn.RemoteAddr())
- go handleConnection(conn)
- }
- }
- func handleConnection(conn net.Conn) {
- defer conn.Close()
- dec := zmostp_go.NewReceiver(&zmostp_go.ReceiverConfig{
- ByteReader: zmostp_go.NewSimpleByteReader(conn),
- EnableCRC: true,
- DecodeFailureLog: LH,
- })
- enc := zmostp_go.NewTransmitter(&zmostp_go.TransmitterConfig{
- Writer: conn,
- HumanFriendlySending: false,
- EnableCRC: true,
- })
- inch := enc.GetMessageInChannel()
- outch := dec.GetMessageOutChannel()
- wg := sync.WaitGroup{}
- wg.Add(3)
- ctx, cncl := context.WithCancel(context.Background())
- go func() {
- err := enc.Run(ctx)
- if err != nil {
- fmt.Printf("[ERR] error in encoder of conn '%s': %v\n", conn.RemoteAddr(), err)
- } else {
- fmt.Printf("[LOG] encoder of conn '%s' done\n", conn.RemoteAddr())
- }
- cncl()
- wg.Done()
- }()
- go func() {
- err := dec.Run(ctx)
- if err != nil {
- fmt.Printf("[ERR] error in decoder of conn '%s': %v\n", conn.RemoteAddr(), err)
- } else {
- fmt.Printf("[LOG] decoder of conn '%s' done\n", conn.RemoteAddr())
- }
- cncl()
- wg.Done()
- }()
- go func() {
- for {
- select {
- case msg := <-outch:
- fmt.Printf("[MSG] Recv msg from ch %d: %v\n", msg.Channel, string(msg.Payload))
- inch <- msg
- case <-ctx.Done():
- fmt.Printf("[LOG] logic of conn '%s' done\n", conn.RemoteAddr())
- return
- }
- }
- }()
- wg.Wait()
- cncl()
- }
|