blob: 9c46de6d649d6d7dc0a814d8df3808e8072d1a5e [file] [log] [blame]
gio4dd2c0d2025-04-11 16:40:55 +04001package main
2
3import (
4 "flag"
5 "fmt"
6 "io"
7 "log"
8 "net"
9)
10
11var port = flag.Int("port", 8080, "port to listen on")
12
13const welcomeMessage = `
14 ____ ____ ____ ____
15 ||D ||||O ||||D ||||O ||
16 ||__||||__||||__||||__||
17 |/__\||/__\||/__\||/__\|
18
19Welcome to the Echo Server!
20`
21
22func main() {
23 flag.Parse()
24
25 // Listen on TCP port from flag
26 listener, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
27 if err != nil {
28 log.Fatalf("Failed to start server: %v", err)
29 }
30 defer listener.Close()
31 fmt.Printf("Echo server listening on :%d\n", *port)
32
33 for {
34 // Accept incoming connections
35 conn, err := listener.Accept()
36 if err != nil {
37 log.Printf("Failed to accept connection: %v", err)
38 continue
39 }
40 // Handle each connection in a separate goroutine
41 go func(c net.Conn) {
42 remoteAddr := c.RemoteAddr().String()
43 log.Printf("New connection from %s", remoteAddr)
44 if err := handleConnection(c); err != nil && err != io.EOF {
45 log.Printf("Error handling connection from %s: %v", remoteAddr, err)
46 }
47 log.Printf("Connection closed from %s", remoteAddr)
48 }(conn)
49 }
50}
51
52func handleConnection(conn net.Conn) error {
53 defer conn.Close()
54
55 // Send welcome message
56 if _, err := conn.Write([]byte(welcomeMessage)); err != nil {
57 return fmt.Errorf("sending welcome message: %w", err)
58 }
59
60 // Create a buffer for reading data
61 buffer := make([]byte, 1024)
62
63 for {
64 // Read incoming data
65 n, err := conn.Read(buffer)
66 if err != nil {
67 return err
68 }
69 // Echo the data back to the client
70 if _, err = conn.Write(buffer[:n]); err != nil {
71 return fmt.Errorf("writing to connection: %w", err)
72 }
73 }
74}