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(); } }