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(); } }
public void StartSend() { if (IsConnected() == false) { return; } if (m_SendQueue.Count <= 0) { return; } if (flagSending.SetTrue() == false) { return; } try { bool pending = true; m_SendingList.Clear(); ArraySegment <byte> arraySeg; while (m_SendQueue.TryDequeue(out arraySeg)) { m_SendingList.Add(arraySeg); } m_SendSAEA.BufferList = m_SendingList; pending = m_Socket.SendAsync(m_SendSAEA); // pending값이 false라면 동기적으로 처리가 완료되서 여기서 바로 처리해줘야함 if (pending == false) { ProcessSend(m_SendSAEA); } } catch (Exception e) { OnError("StartReceive", e); flagSending.ForceFalse(); Disconnect(CloseReason.SocketError); return; } }