示例#1
0
        private void ProcessConnect(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                MDebug.Log(LOG_TAG, $"Client({GetName()}) 连接成功");


                m_BufferPool = new ArrayPool <byte>(1024 * 512);
                lock (m_TcpConnectActionLock)
                {
                    m_TcpConnectData = new TcpConnectData(this, e, ConnectState.Connected);
                }
                m_IsSending = false;

                lock (m_BufferPool)
                {
                    m_SendEventArgs            = new SocketAsyncEventArgs();
                    m_SendEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessSend);
                    m_SendingBuffer            = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE);
                    m_WaitSendBuffer           = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE);
                    m_WaitSendBufferSize       = 0;
                    m_SendEventArgs.SetBuffer(m_SendingBuffer.GetBuffer(), m_SendingBuffer.GetOffset(), 0);

                    m_ReceiveEventArgs            = new SocketAsyncEventArgs();
                    m_ReceiveEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessReceive);
                    m_ReceiveBuffer = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE);
                    m_ReceiveEventArgs.SetBuffer(m_ReceiveBuffer.GetBuffer(), m_ReceiveBuffer.GetOffset(), m_ReceiveBuffer.GetSize());

                    m_ReceiveState         = ReceiveState.ReceivingPackageLength;
                    m_ReceivedPackageCount = 0;
                    m_ReceiveHeaderBuffer  = m_BufferPool.AllocBuffer(PACKAGE_HEADER_SIZE);
                }

                lock (m_ReceiveLock)
                {
                    m_ReceivedPackages  = new Queue <ArrayPool <byte> .Node>();
                    m_ReceivedPackages2 = new BetterList <ArrayPool <byte> .Node>(4);
                    m_ReceivedPackages2._SetCount(m_ReceivedPackages2.Capacity);
                }

                StartReceive();
            }
            else
            {
                MDebug.LogError(LOG_TAG
                                , $"Client({GetName()}) 连接失败: {e.SocketError.ToString()}\n{e.ConnectByNameError.ToString()}");
                lock (m_TcpConnectActionLock)
                {
                    m_TcpConnectData = new TcpConnectData(this, e, ConnectState.ConnectFailed);
                }

                m_Client.Close();
                m_Client = null;
            }
        }
示例#2
0
        private void Disconnect(SocketAsyncEventArgs e)
        {
            if (m_Client == null)
            {
                return;
            }

            if (m_BufferPool != null)
            {
                lock (m_BufferPool)
                {
                    m_SendEventArgs = null;
                    m_BufferPool.ReleaseBuffer(m_SendingBuffer);
                    m_SendingBuffer = null;
                    m_BufferPool.ReleaseBuffer(m_WaitSendBuffer);
                    m_WaitSendBuffer = null;

                    m_ReceiveEventArgs = null;
                    m_BufferPool.ReleaseBuffer(m_ReceiveBuffer);
                    m_ReceiveBuffer = null;
                    if (m_ReceiveBodyBuffer != null)
                    {
                        m_BufferPool.ReleaseBuffer(m_ReceiveBodyBuffer);
                        m_ReceiveBodyBuffer = null;
                    }

                    m_BufferPool.ReleaseBuffer(m_ReceiveHeaderBuffer);
                    m_ReceiveHeaderBuffer = null;
                }

                lock (m_BufferPool)
                {
                    lock (m_ReceiveLock)
                    {
                        while (m_ReceivedPackages.Count > 0)
                        {
                            m_BufferPool.ReleaseBuffer(m_ReceivedPackages.Dequeue());
                        }
                    }
                }

                m_BufferPool.Release();
                m_BufferPool = null;
            }

            m_Client.Close();
            m_Client = null;

            lock (m_TcpConnectActionLock)
            {
                m_TcpConnectData = new TcpConnectData(this, e, ConnectState.Disconnected);
            }
        }
示例#3
0
        public override void OnUpdate(float deltaTime)
        {
            lock (m_TcpConnectActionLock)
            {
                if (m_TcpConnectData != null)
                {
                    try
                    {
                        switch (m_TcpConnectData.ConnectState)
                        {
                        case ConnectState.Connected:
                            OnConnected?.Invoke(m_TcpConnectData);
                            break;

                        case ConnectState.ConnectFailed:
                            OnConnectFailed?.Invoke(m_TcpConnectData);
                            break;

                        case ConnectState.Disconnected:
                            OnDisconnected?.Invoke(m_TcpConnectData);
                            break;

                        default:
                            MDebug.Assert(false, LOG_TAG, "Not handle ConnectState: " + m_TcpConnectData.ConnectState);
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        MDebug.LogError(LOG_TAG
                                        , $"Inove connect:{m_TcpConnectData.ConnectState} Exception:\n{e.ToString()}");
                    }
                    m_TcpConnectData = null;
                }
            }

            if (!IsConnected() ||
                m_ReceivedPackages2 == null)
            {
                return;
            }

            int packageCount;

            lock (m_ReceiveLock)
            {
                packageCount = m_ReceivedPackages.Count;
                if (m_ReceivedPackages2.Capacity < packageCount)
                {
                    m_ReceivedPackages2.Capacity = m_ReceivedPackages2.Capacity * 2;
                    m_ReceivedPackages2._SetCount(m_ReceivedPackages2.Capacity);
                }
                for (int iPackage = 0; iPackage < packageCount; iPackage++)
                {
                    m_ReceivedPackages2[iPackage] = m_ReceivedPackages.Dequeue();
                }
#if GF_DEBUG
                MDebug.Assert(m_ReceivedPackages.Count == 0, LOG_TAG, "m_ReceivedPackages.Count == 0");
#endif
            }

            if (packageCount > 0)
            {
                if (OnReceivedPackage != null)
                {
                    for (int iPackage = 0; iPackage < packageCount; iPackage++)
                    {
                        ArrayPool <byte> .Node iterPackage = m_ReceivedPackages2[iPackage];
                        try
                        {
                            OnReceivedPackage.Invoke(iterPackage);
                        }
                        catch (Exception e)
                        {
                            MDebug.LogError(LOG_TAG
                                            , $"Invoke OnReceivedPackage length: {iterPackage.GetSize()}. Exception:\n{e.ToString()}");
                        }
                    }
                }

                lock (m_BufferPool)
                {
                    for (int iPackage = 0; iPackage < packageCount; iPackage++)
                    {
                        m_BufferPool.ReleaseBuffer(m_ReceivedPackages2[iPackage]);
                        m_ReceivedPackages2[iPackage] = null;
                    }
                }
            }
        }