blob: 81b5eb8ff22bf61aa15f402f341024471e83a1a4 [file] [log] [blame]
gio4dd2c0d2025-04-11 16:40:55 +04001package main
2
3import (
4 "flag"
5 "fmt"
6 "io"
7 "log"
8 "net"
giocbd89092025-04-11 16:53:19 +04009 "os"
10 "strconv"
gio4dd2c0d2025-04-11 16:40:55 +040011)
12
13var port = flag.Int("port", 8080, "port to listen on")
14
15const welcomeMessage = `
16 ____ ____ ____ ____
17 ||D ||||O ||||D ||||O ||
18 ||__||||__||||__||||__||
19 |/__\||/__\||/__\||/__\|
20
21Welcome to the Echo Server!
22`
23
24func main() {
25 flag.Parse()
26
giocbd89092025-04-11 16:53:19 +040027 // Check for environment variable first
28 if envPort := os.Getenv("DODO_PORT_ECHO"); envPort != "" {
29 p, err := strconv.Atoi(envPort)
30 if err != nil {
31 log.Fatalf("Invalid DODO_PORT_ECHO value %s: %s", envPort, err)
32 }
33 *port = p
34 }
35
gio4dd2c0d2025-04-11 16:40:55 +040036 // Listen on TCP port from flag
37 listener, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
38 if err != nil {
giocbd89092025-04-11 16:53:19 +040039 log.Fatalf("Failed to start server: %s", err)
gio4dd2c0d2025-04-11 16:40:55 +040040 }
41 defer listener.Close()
42 fmt.Printf("Echo server listening on :%d\n", *port)
43
44 for {
45 // Accept incoming connections
46 conn, err := listener.Accept()
47 if err != nil {
giocbd89092025-04-11 16:53:19 +040048 log.Printf("Failed to accept connection: %s", err)
gio4dd2c0d2025-04-11 16:40:55 +040049 continue
50 }
51 // Handle each connection in a separate goroutine
52 go func(c net.Conn) {
53 remoteAddr := c.RemoteAddr().String()
54 log.Printf("New connection from %s", remoteAddr)
55 if err := handleConnection(c); err != nil && err != io.EOF {
giocbd89092025-04-11 16:53:19 +040056 log.Printf("Error handling connection from %s: %s", remoteAddr, err)
gio4dd2c0d2025-04-11 16:40:55 +040057 }
58 log.Printf("Connection closed from %s", remoteAddr)
59 }(conn)
60 }
61}
62
63func handleConnection(conn net.Conn) error {
64 defer conn.Close()
65
66 // Send welcome message
67 if _, err := conn.Write([]byte(welcomeMessage)); err != nil {
giocbd89092025-04-11 16:53:19 +040068 return fmt.Errorf("sending welcome message: %s", err)
gio4dd2c0d2025-04-11 16:40:55 +040069 }
70
71 // Create a buffer for reading data
72 buffer := make([]byte, 1024)
73
74 for {
75 // Read incoming data
76 n, err := conn.Read(buffer)
77 if err != nil {
78 return err
79 }
80 // Echo the data back to the client
81 if _, err = conn.Write(buffer[:n]); err != nil {
giocbd89092025-04-11 16:53:19 +040082 return fmt.Errorf("writing to connection: %s", err)
gio4dd2c0d2025-04-11 16:40:55 +040083 }
84 }
85}