コード例 #1
0
        void process_recv_queue()
        {
            mRecvQueue.Switch();

            bool bHadRecv = !mRecvQueue.Empty();

            while (!mRecvQueue.Empty())
            {
                var buf = mRecvQueue.Pop();

                mNeedUpdateFlag = true;

                //跳过心跳包
                if (buf.Length <= 4)
                {
                    if (buf.Length == 4)
                    {
                        UInt32 errorCode = BitConverter.ToUInt32(buf, 0);
                        if (m_nDisconnectError == errorCode)
                        {
                            UnityEngine.Debug.LogWarning("recive disconnect data....");
                            if (m_socketSink != null)
                            {
                                mConnectSucceed = false;
                                m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_SERVER_HANDSHAKE_DISCONNECT);
                            }
                            return;
                        }
                    }

                    continue;
                }

                mKcp.Input(buf);

                for (var size = mKcp.PeekSize(); size > 0; size = mKcp.PeekSize())
                {
                    int nRecvSize = mKcp.Recv(recievebuffer);
                    if (nRecvSize > 0)
                    {
                        if (m_socketSink != null)
                        {
                            m_socketSink.OnReceive(m_nSocketID, recievebuffer, 0, nRecvSize);
                        }
                    }
                }
            }

            //更新接收时间

            if (bHadRecv)
            {
                mLastReceiveTime = iclock();
                //推进一下发心跳包的时间
                mLasRecieveFrame = mCurFrame;
            }
        }
コード例 #2
0
ファイル: TCPSocketClient.cs プロジェクト: mengtest/MyGame
        private void ThreadReceive()
        {
            var packetBuffer = new PacketBuffer();

            while (!m_Abort && IsConnected())
            {
                try
                {
                    int num = m_Connection.Receive(packetBuffer.buffer, packetBuffer.len, BufferSize - packetBuffer.len, SocketFlags.None);
                    if (num > 0)
                    {
                        packetBuffer.len += num;

                        int index = 0;
                        for (; index + PacketHeaderSize <= packetBuffer.len;)
                        {
                            UInt16 packetLen = BitConverter.ToUInt16(packetBuffer.buffer, index);
                            if (index + packetLen + PacketLenSize > packetBuffer.len)
                            {
                                break;
                            }

                            //回调数据包给上层处理
                            if (m_socketSink != null)
                            {
                                m_socketSink.OnReceive(m_nSocketID, packetBuffer.buffer, index + PacketHeaderSize, (int)packetLen);
                            }
                            index += packetLen + PacketLenSize;
                        }

                        int remainSize = packetBuffer.len - index;
                        if (remainSize > 0)
                        {
                            Array.Copy(packetBuffer.buffer, index, packetBuffer.swapBuffer, 0, remainSize);

                            byte[] temp = packetBuffer.buffer;
                            packetBuffer.buffer     = packetBuffer.swapBuffer;
                            packetBuffer.swapBuffer = temp;
                        }
                        packetBuffer.len = remainSize;
                    }
                    else
                    {
                        if (m_socketSink != null)
                        {
                            m_socketSink.OnClose(m_nSocketID);
                        }

                        break;
                    }
                }
                catch (SocketException e)
                {
                    m_Abort = true;
                    UnityEngine.Debug.LogErrorFormat("ThreadReceive error:{0}", e.ToString());

                    if (m_socketSink != null)
                    {
                        m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_CONNECT_ERROR);
                    }
                }
                catch (OverflowException e)
                {
                    m_Abort = true;
                    UnityEngine.Debug.LogErrorFormat("ThreadReceive error:{0}", e.ToString());

                    if (m_socketSink != null)
                    {
                        m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_CONNECT_ERROR);
                    }
                }
            }

            m_bRunReceive = false;
        }