private void SendMessage(SocketAsyncEventArgs sendEventArgs)
        {
            DataHoldingUserToken sendToken = (DataHoldingUserToken)sendEventArgs.UserToken;

            sendToken.sendBytesRemainingCount = sendToken.dataToSend.Length;
            sendToken.bytesSentAlreadyCount   = 0;

            sendToken.CreateNewDataHolder();
            sendToken.Reset();

            this.StartSend(sendEventArgs);
        }
        private void ProcessReceive(SocketAsyncEventArgs recvEventArgs)
        {
            DataHoldingUserToken recvToken = recvEventArgs.UserToken as DataHoldingUserToken;

            // 이벤트 검사
            if (!ValidationCheckSocketAsyncEventArgs("ProcessReceive", recvEventArgs))
            {
                recvToken.Reset();
                this.CloseClientSocket(recvEventArgs);
                return;
            }

            try
            {
                if (recvEventArgs.BytesTransferred == 0)
                {
                    SocketListener.Log.WRN(recvEventArgs, "RecvEventArgs.BytesTransferred is zero. !!");
                    recvToken.Reset();
                    this.CloseClientSocket(recvEventArgs);
                    return;
                }

                FACInfo facInfo = FACContainer.FindFACInfo(recvEventArgs);
                if (facInfo == null)
                {
                    SocketListener.Log.ERR(recvEventArgs, "Not found facinfo.");
                    recvToken.Reset();
                    return;
                }

                facInfo.LastRequestTime = DateTime.Now;

                Int32 remainingBytesToProcess = recvEventArgs.BytesTransferred;

                if (recvToken.receivedPrefixBytesDoneCount < this.socketListenerSettings.ReceivePrefixLength)
                {
                    /// 공통 전문 첫 컬럼 (전문길이) 읽기
                    remainingBytesToProcess = prefixHandler.HandlePrefix(recvEventArgs, recvToken, remainingBytesToProcess);
                    if (remainingBytesToProcess == 0)
                    {
                        SocketListener.Log.WRN(recvEventArgs, "RemainingBytesToProcess is zero. !!");
                        StartReceive(recvEventArgs);
                        return;
                    }
                }

                // 전문길이만큼 전문 읽기
                bool incomingTcpMessageIsReady = messageHandler.HandleMessage(recvEventArgs, recvToken, remainingBytesToProcess);
                if (incomingTcpMessageIsReady == true)
                {
                    SocketAsyncEventArgs sendEventArgs = facInfo.sendEventArgs;
                    if (recvEventArgs == null)
                    {
                        recvToken.Reset();
                        //CloseClientSocket(recvEventArgs);
                        return;
                    }

                    LOG_LEVEL logLv      = LOG_LEVEL.MSG;
                    string    packetName = m_Encoding.GetString(recvToken.dataToReceive, 34, 5);
                    if (packetName == MessagePacketNameEnum.ALIVE.ToString())
                    {
                        logLv = LOG_LEVEL.TRC;
                    }
                    else
                    {
                        logLv = LOG_LEVEL.MSG;
                    }

                    // 패킷 로그
                    SocketListener.Log.LogWrite(logLv,
                                                "RECEIVE ",
                                                recvEventArgs.AcceptSocket.RemoteEndPoint.ToString(),
                                                recvEventArgs.AcceptSocket.Handle.ToInt32(),
                                                recvToken.TokenId,
                                                recvToken.dataToReceive.Length,
                                                m_Encoding.GetString(recvToken.dataToReceive));

                    // 응답 전문 보내기
                    this.SendMessageToClient(sendEventArgs);
                }
                else
                {
                    recvToken.receiveMessageOffset     = recvToken.bufferOffsetReceive;
                    recvToken.recPrefixBytesDoneThisOp = 0;
                }

                StartReceive(recvEventArgs);
            }
            catch (Exception ex)
            {
                SocketListener.Log.ERR(recvEventArgs, string.Format("ProcessReceive : {0}", ex.Message));
                recvToken.Reset();
            }
        }