Пример #1
0
        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();
            }
        }
Пример #2
0
        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;
            }
        }