diff --git a/socketserver/internal/server/commands.go b/socketserver/internal/server/commands.go index 54557192..57d1e496 100644 --- a/socketserver/internal/server/commands.go +++ b/socketserver/internal/server/commands.go @@ -431,7 +431,10 @@ func HandleBunchedRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg Cl bsl.Lock() for _, member := range bsl.Members { msg.MessageID = member.MessageID - member.Client.MessageChannel <- msg + select { + case member.Client.MessageChannel <- msg: + case <-member.Client.MsgChannelIsDone: + } member.Client.MsgChannelKeepalive.Done() } bsl.Unlock() diff --git a/socketserver/internal/server/handlecore.go b/socketserver/internal/server/handlecore.go index 935fbafd..f6778d55 100644 --- a/socketserver/internal/server/handlecore.go +++ b/socketserver/internal/server/handlecore.go @@ -152,6 +152,7 @@ func HandleSocketConnection(conn *websocket.Conn) { var client ClientInfo client.MessageChannel = _serverMessageChan client.RemoteAddr = conn.RemoteAddr() + client.MsgChannelIsDone = stoppedChan // Launch receiver goroutine go func(errorChan chan<- error, clientChan chan<- ClientMessage, stoppedChan <-chan struct{}) { @@ -186,7 +187,10 @@ func HandleSocketConnection(conn *websocket.Conn) { if err != io.EOF && !isClose { log.Println("Error while reading from client:", err) } - errorChan <- err + select { + case errorChan <- err: + case <-stoppedChan: + } close(errorChan) close(clientChan) // exit diff --git a/socketserver/internal/server/types.go b/socketserver/internal/server/types.go index 97dae35a..2f6013b3 100644 --- a/socketserver/internal/server/types.go +++ b/socketserver/internal/server/types.go @@ -91,6 +91,8 @@ type ClientInfo struct { // This field will be nil before it is closed. MessageChannel chan<- ClientMessage + MsgChannelIsDone <-chan struct{} + // Take out an Add() on this during a command if you need to use the MessageChannel later. MsgChannelKeepalive sync.WaitGroup