diff options
Diffstat (limited to 'internal/tcpserver.go')
| -rw-r--r-- | internal/tcpserver.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/internal/tcpserver.go b/internal/tcpserver.go new file mode 100644 index 0000000..f264d9e --- /dev/null +++ b/internal/tcpserver.go @@ -0,0 +1,60 @@ +package internal + +import ( + "bufio" + "context" + "fmt" + "log" + "net" + "time" +) + +func startTcpServer(ctx context.Context, address string, ch chan<- vote) error { + listener, err := net.Listen("tcp", address) + if err != nil { + return fmt.Errorf("Error starting TCP server: %s", err.Error()) + } + defer listener.Close() + + log.Printf("TCP server started on %s\n", address) + + for { + // Accept incoming client connections + conn, err := listener.Accept() + if err != nil { + log.Printf("Error accepting connection: %s\n", err.Error()) + continue + } + + log.Printf("Client connected: %s\n", conn.RemoteAddr().String()) + + // Handle the connection in a new goroutine + go handleConnection(ctx, conn, ch) + } +} + +func handleConnection(ctx context.Context, conn net.Conn, ch chan<- vote) { + defer conn.Close() + remoteAddr := conn.RemoteAddr().String() + log.Printf("Client %s connected\n", remoteAddr) + + reader := bufio.NewReader(conn) + for { + select { + case <-ctx.Done(): + log.Printf("Server context done, disconnecting client %s\n", remoteAddr) + return + default: + message, err := reader.ReadString('\n') + if err != nil { + log.Printf("Client %s disconnected: %s\n", remoteAddr, err.Error()) + break + } + + log.Printf("Received message from %s: %s", remoteAddr, message) + ch <- vote{From: remoteAddr, time: time.Now()} + + conn.Write([]byte(message)) + } + } +} |
