public void StartReceive() { if (IsConnected() == false) { Disconnect(); flagReceiving.ForceFalse(); return; } try { bool pending = true; pending = m_Socket.ReceiveAsync(m_RecvSAEA); flagReceiving.ForceTrue(); // pending값이 false라면 동기적으로 처리가 완료되서 여기서 바로 처리해줘야함 if (pending == false) { ProcessReceive(m_RecvSAEA); } } catch (Exception e) { OnError("StartReceive", e); flagReceiving.ForceFalse(); Disconnect(CloseReason.SocketError); return; } }
public void Disconnect(CloseReason reason = CloseReason.Unknown) { //// 받거나 보내고 있는 중이라면 Closing으로 바꾸고 넘어가자 //if (flagReceiving.IsTrue() || flagSending.IsTrue()) //{ // flagClosing.ForceTrue(); // m_ClosingReason = reason; // return; //} if (flagClosing.SetTrue() == true) { if (reason == CloseReason.Unknown) { reason = m_ClosingReason; } else { m_ClosingReason = reason; } m_SendingList.Clear(); ArraySegment <byte> arraySeg; while (m_SendQueue.TryDequeue(out arraySeg)) { Server.m_PooledBufferManager.Return(arraySeg.Array); } if (m_Socket != null) { m_Socket.CloseEx(); m_Socket = null; } // 얘들은 윗단에서 이벤트 받은 서버쪽에서 풀에 다시 넣는다 //m_RecvSAEA = null; //m_SendSAEA = null; Server = null; OnDisconnected(reason); flagClosed.ForceTrue(); } }