summaryrefslogtreecommitdiff
path: root/internal/tcpserver.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/tcpserver.go')
-rw-r--r--internal/tcpserver.go60
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))
+ }
+ }
+}