void OnReceive(IAsyncResult ar)
        {
            var sc = (SocketConnection)ar.AsyncState;

            try
            {
                int bytesReceived = sc.Socket.EndReceive(ar);

                if (bytesReceived > 0)
                {
                    // There  might be more data, so store the data received so far and check for eof
                    if (sc.CopyBuffer(bytesReceived))
                    {
                        var replyBuffer = selector.Select(sc.GetDataBuffer());

                        sc.Socket.BeginSend(replyBuffer, 0, replyBuffer.Length, SocketFlags.None, OnSend, sc);
                    }
                    else
                    {
                        // Not there, read more data
                        sc.Socket.BeginReceive(sc.SocketBuffer, 0, sc.BufferSize, SocketFlags.None, OnReceive, sc);
                    }
                }
            }
            catch (Exception ex)
            {
                CloseConnection(sc);

                Logger.Error("An error has occured while trying to receive data from the client. Exception = {0}", LogSource.AppServer, ex);
            }
        }