package net import ( "cimeyclust.com/steel/pkg/cmd" "fmt" "net" "sync" "time" ) // Start Starts the TCP server on the specified address. func Start(addr string, stopChan <-chan struct{}, wg *sync.WaitGroup) { defer wg.Done() // Start listening on the specified address listener, err := net.Listen("tcp", addr) if err != nil { cmd.Logger.Error("Error starting TCP server: %v") } // Close the listener when the application closes. defer func(listener net.Listener) { err := listener.Close() if err != nil { return } }(listener) // slog.Info(fmt.Sprintf("Listening on %s", addr)) cmd.Logger.Info(fmt.Sprintf("Listening on %s", addr)) go func() { for { // Print test every second select { case <-stopChan: return // Safe exit if stop has been signalled default: cmd.Logger.Info("Test") } time.Sleep(1 * time.Second) } }() // Listen for an incoming connection in a goroutine. go func() { for { conn, err := listener.Accept() if err != nil { select { case <-stopChan: return // Safe exit if stop has been signalled default: cmd.Logger.Error(fmt.Sprintf("Error while accepting conn: %v", err)) } continue } // Handle connections in a new goroutine. go handleRequest(conn) } }() // Block until we receive a stop signal <-stopChan } // handleRequest handles incoming requests. func handleRequest(conn net.Conn) { // Close the connection when you're done with it. defer conn.Close() // Make a buffer to hold incoming data. buf := make([]byte, 1024) // Read the incoming connection into the buffer. _, err := conn.Read(buf) if err != nil { cmd.Logger.Error(fmt.Sprintf("Error reading: %v", err)) return } // Send a response back to person contacting us. conn.Write([]byte("Hello, World!\n")) }