diff --git a/cmd/client.go b/cmd/client.go index 1f86e8f..686ad68 100644 --- a/cmd/client.go +++ b/cmd/client.go @@ -69,8 +69,7 @@ func runClient(cmd *cobra.Command, args []string) { run := true for run { var oFrame data.Frame - // always use new decoder - reusing may lead to errors - gd := gob.NewDecoder(con) + gd := gob.NewDecoder(con) // always use new decoder err = gd.Decode(&oFrame) if err != nil { log.Println("RGS:", err) diff --git a/cmd/server.go b/cmd/server.go index 8d1ca97..0e297b5 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -42,9 +42,8 @@ var clientKeys []int = make([]int, 100) func handleConn(conn *net.TCPConn) { var hs data.Handshake log.Println("Got a connection!") - // handshake - dec := gob.NewDecoder(conn) // Decoder - dec.Decode(&hs) + dec := gob.NewDecoder(conn) + dec.Decode(&hs) // decode handshake log.Println("Got client! ID:", hs.ID, "dimensions:", hs.W, hs.H) clientKeys = append(clientKeys, hs.ID) sort.Ints(clientKeys) @@ -68,8 +67,23 @@ func serveClients() { id, client := k, clients[k] if id > 0 { enc := gob.NewEncoder(client.con) - enc.Encode(oFrame) + err := enc.Encode(oFrame) + if err != nil { + // client disconnected + //log.Println("BEFORE remove: clients:", clients, " clientKeys:", clientKeys) + + // delete client + delete(clients, client.id) + + // delete client key + // ugly as fuck in go to remove from a slice + // it *should* work though + idInKeys := sort.SearchInts(clientKeys, client.id) + clientKeys = append(clientKeys[:idInKeys], clientKeys[idInKeys+1:]...) + + //log.Println("AFTER remove: clients:", clients, " clientKeys:", clientKeys) + } //log.Println("ID:", id, "Client:", client) } }