Echo: Basic TCP echo server

Change-Id: I46e1f0e4d2733d14609efa68953e09b631cc28fb
diff --git a/apps/echo/go.mod b/apps/echo/go.mod
new file mode 100644
index 0000000..b958ea0
--- /dev/null
+++ b/apps/echo/go.mod
@@ -0,0 +1,3 @@
+module echo
+
+go 1.23.1
diff --git a/apps/echo/main.go b/apps/echo/main.go
new file mode 100644
index 0000000..9c46de6
--- /dev/null
+++ b/apps/echo/main.go
@@ -0,0 +1,74 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"log"
+	"net"
+)
+
+var port = flag.Int("port", 8080, "port to listen on")
+
+const welcomeMessage = `
+    ____  ____  ____  ____ 
+   ||D ||||O ||||D ||||O ||
+   ||__||||__||||__||||__||
+   |/__\||/__\||/__\||/__\|
+
+Welcome to the Echo Server!
+`
+
+func main() {
+	flag.Parse()
+
+	// Listen on TCP port from flag
+	listener, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
+	if err != nil {
+		log.Fatalf("Failed to start server: %v", err)
+	}
+	defer listener.Close()
+	fmt.Printf("Echo server listening on :%d\n", *port)
+
+	for {
+		// Accept incoming connections
+		conn, err := listener.Accept()
+		if err != nil {
+			log.Printf("Failed to accept connection: %v", err)
+			continue
+		}
+		// Handle each connection in a separate goroutine
+		go func(c net.Conn) {
+			remoteAddr := c.RemoteAddr().String()
+			log.Printf("New connection from %s", remoteAddr)
+			if err := handleConnection(c); err != nil && err != io.EOF {
+				log.Printf("Error handling connection from %s: %v", remoteAddr, err)
+			}
+			log.Printf("Connection closed from %s", remoteAddr)
+		}(conn)
+	}
+}
+
+func handleConnection(conn net.Conn) error {
+	defer conn.Close()
+
+	// Send welcome message
+	if _, err := conn.Write([]byte(welcomeMessage)); err != nil {
+		return fmt.Errorf("sending welcome message: %w", err)
+	}
+
+	// Create a buffer for reading data
+	buffer := make([]byte, 1024)
+
+	for {
+		// Read incoming data
+		n, err := conn.Read(buffer)
+		if err != nil {
+			return err
+		}
+		// Echo the data back to the client
+		if _, err = conn.Write(buffer[:n]); err != nil {
+			return fmt.Errorf("writing to connection: %w", err)
+		}
+	}
+}
\ No newline at end of file