private void CloseClientSocket(SocketAsyncEventArgs e) { AsyncUserToken token = e.UserToken as AsyncUserToken; // close the socket associated with the client try { token.Socket.Shutdown(SocketShutdown.Send); } // throws if client process has already closed catch (Exception) { } token.Socket.Close(); // decrement the counter keeping track of the total number of clients connected to the server Interlocked.Decrement(ref m_numConnectedSockets); m_maxNumberAcceptedClients.Release(); _logger.Log("Echo server: A client has been disconnected from the server. There are " + m_numConnectedSockets + " clients connected to the server"); // Free the SocketAsyncEventArg so they can be reused by another client m_readWritePool.Push(e); }
/// <summary> /// This method is invoked when an asycnhronous receive operation completes. If the /// remote host closed the connection, then the socket is closed. If data was received then /// the data is echoed back to the client. /// </summary> private void ProcessReceive(SocketAsyncEventArgs e) { // check if the remote host closed the connection AsyncUserToken token = (AsyncUserToken)e.UserToken; if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { //increment the count of the total bytes receive by the server Interlocked.Add(ref m_totalBytesRead, e.BytesTransferred); _logger.Log("Echo server has read a total of " + m_totalBytesRead + " bytes"); //echo the data received back to the client bool willRaiseEvent = token.Socket.SendAsync(e); if (!willRaiseEvent) { ProcessSend(e); } } else { CloseClientSocket(e); } }