private void CloseClientSocket(SocketAsyncEventArgs e) { AsyncUserToken token = e.UserToken as AsyncUserToken; // close the socket associated with the client try { token.AcceptSocket.Shutdown(SocketShutdown.Send); } // throws if client process has already closed catch (Exception) {} token.AcceptSocket.Close(); if (m_clients.TryRemove(token.ID, out _)) { // Free the SocketAsyncEventArg so they can be reused by another client m_maxNumberAcceptedClients.Release(); Console.WriteLine("ID [ {0} ] client has been disconnected from the Server. There are {1} clients connected to the server", token.ID, m_clients.Count); // Free the SocketAsyncEventArg so they can be reused by another client m_readWritePool.Push(e); OnClientClosed?.Invoke(token.ID); } }
/// <summary> /// Al ocurrir un error en la conexión WebSocket /// </summary> /// <param name="e"></param> protected override void OnError(ErrorEventArgs e) { if (OnClientClosed == null) { return; } Debug.WriteLine(this, "Ocurrio un error en una conexión socket: " + e.Message, VerbosityLevel.Warning); OnClientClosed?.Invoke(this, Context.WebSocket); }
/// <summary> /// Al cerrarse la conexión WebSocket /// </summary> /// <param name="e">Información del cierre</param> protected override void OnClose(CloseEventArgs e) { if (OnClientClosed == null) { return; } Debug.WriteLine(this, "Se desconecto correctamente una conexión socket: " + e.Reason, VerbosityLevel.Default); OnClientClosed?.Invoke(this, Context.WebSocket); }