From 350b000e2374039bf58c75ecd9237fad3b49c64a Mon Sep 17 00:00:00 2001 From: illyum Date: Sat, 26 Oct 2024 20:55:28 -0600 Subject: [PATCH] fix(server): disconnects clients who crash/exit --- server/server.go | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/server/server.go b/server/server.go index aa3398e..d0f0357 100644 --- a/server/server.go +++ b/server/server.go @@ -5,9 +5,11 @@ import ( "encoding/json" "fmt" "io" + "log" "math/rand" "net" "sync" + "time" ) const PORT = ":5518" @@ -159,7 +161,8 @@ func handleClient(conn net.Conn) { var packetId PacketID packetId, data, err := readPacket(conn) if err != nil { - fmt.Println("Error reading packet:", err) + fmt.Println("Error reading packet (handleclient) :", err) + handleLeaveRoom(conn) return } @@ -354,13 +357,12 @@ func handleLeaveRoom(conn net.Conn) { break } } - if leavingClient == nil { fmt.Println("Client not found") return } - room := findRoom(leavingClient.RoomCode) + room := rooms[leavingClient.RoomCode] if room == nil { fmt.Println("Room not found") return @@ -368,30 +370,31 @@ func handleLeaveRoom(conn net.Conn) { for i, client := range room.Clients { if client == leavingClient { - // Remove the client from the list room.Clients = append(room.Clients[:i], room.Clients[i+1:]...) break } } - // If the room is now empty or the leaving client was the creator, delete the room - if len(room.Clients) == 0 || room.Clients[0] == leavingClient { - for _, client := range room.Clients { - client.Conn.Close() - } - + // Delete the room if its empty + if len(room.Clients) == 0 { delete(rooms, room.Code) fmt.Println("Room", room.Code, "deleted") - } else { - // // Notify remaining clients that a user has left (optional) - // for _, remainingClient := range room.Clients { - // writePacket(remainingClient.Conn, byte(LEAVE_ROOM), []byte(fmt.Sprintf("User %s has left the room", leavingClient.ClientID))) - // } } delete(clients, leavingClient.ClientID) - leavingClient.Conn.Close() + done := make(chan struct{}) + go func() { + leavingClient.Conn.Close() + close(done) + }() + + select { + case <-done: + case <-time.After(5 * time.Second): + log.Fatalln("Timeout while closing leaving client's connection") + } + fmt.Println("Client", leavingClient.ClientID, "left the room and connection closed") }