Esempio n. 1
0
        public int Recv(byte[] data, int index, int length)
        {
            // 上次剩下的部分
            if (mRecvBuffer.ReadableBytes > 0)
            {
                var recvBytes = Math.Min(mRecvBuffer.ReadableBytes, length);
                Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, recvBytes);
                mRecvBuffer.ReaderIndex += recvBytes;
                // 读完重置读写指针
                if (mRecvBuffer.ReaderIndex == mRecvBuffer.WriterIndex)
                {
                    mRecvBuffer.Clear();
                }
                return(recvBytes);
            }

            if (mSocket == null)
            {
                return(-1);
            }

            if (!mSocket.Poll(0, SelectMode.SelectRead))
            {
                return(0);
            }

            var rn = 0;

            try
            {
                rn = mSocket.Receive(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, mRecvBuffer.WritableBytes, SocketFlags.None);
            }
            catch (Exception ex) {
                GameLog.Log(ex.Message);
                rn = -1;
            }

            if (rn <= 0)
            {
                return(rn);
            }
            mRecvBuffer.WriterIndex += rn;

            var inputN = mKCP.Input(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes, true, AckNoDelay);

            if (inputN < 0)
            {
                mRecvBuffer.Clear();
                return(inputN);
            }
            mRecvBuffer.Clear();

            // 读完所有完整的消息
            for (;;)
            {
                var size = mKCP.PeekSize();
                if (size <= 0)
                {
                    break;
                }

                mRecvBuffer.EnsureWritableBytes(size);

                var n = mKCP.Recv(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, size);
                if (n > 0)
                {
                    mRecvBuffer.WriterIndex += n;
                }
            }

            // 有数据待接收
            if (mRecvBuffer.ReadableBytes > 0)
            {
                return(Recv(data, index, length));
            }

            return(0);
        }
Esempio n. 2
0
        public int Recv(byte[] data, int index, int length)
        {
            // 上次剩下的部分
            if (mRecvBuffer.ReadableBytes > 0)
            {
                var recvBytes = Math.Min(mRecvBuffer.ReadableBytes, length);
                Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, recvBytes);
                mRecvBuffer.ReaderIndex += recvBytes;
                // 读完重置读写指针
                if (mRecvBuffer.ReaderIndex == mRecvBuffer.WriterIndex)
                {
                    mRecvBuffer.Clear();
                }
                return(recvBytes);
            }

            if (mSocket == null)
            {
                return(-1);
            }

            if (!mSocket.Poll(0, SelectMode.SelectRead))
            {
                return(0);
            }

            var rn = 0;

            try {
                rn = mSocket.Receive(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, mRecvBuffer.WritableBytes, SocketFlags.None);
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
                rn = -1;
            }

            if (rn <= 0)
            {
                return(rn);
            }
            mRecvBuffer.WriterIndex += rn;

            var inputN = mKCP.Input(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes, true, true);

            if (inputN < 0)
            {
                mRecvBuffer.Clear();
                return(inputN);
            }
            mRecvBuffer.Clear();

            var size = mKCP.PeekSize();

            if (size > 0)
            {
                // 外部缓存足够时, 直接写入
                if (length > size)
                {
                    return(mKCP.Recv(data, index, length));
                }

                // 使用内部缓存
                mRecvBuffer.EnsureWritableBytes(size);
                var n = mKCP.Recv(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, size);
                if (n > 0)
                {
                    mRecvBuffer.WriterIndex += n;
                }

                // 余下部分,下次接受
                Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, length);
                mRecvBuffer.ReaderIndex += length;
                return(length);
            }

            return(0);
        }
Esempio n. 3
0
        public int Recv(byte[] data, int index, int length)
        {
            // 上次剩下的部分
            if (mRecvBuffer.ReadableBytes > 0)
            {
                var recvBytes = Math.Min(mRecvBuffer.ReadableBytes, length);
                Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, recvBytes);
                mRecvBuffer.ReaderIndex += recvBytes;
                // 读完重置读写指针
                if (mRecvBuffer.ReaderIndex == mRecvBuffer.WriterIndex)
                {
                    mRecvBuffer.Clear();
                }

                return(recvBytes);
            }

            if (mSocket == null)
            {
                return(-1);
            }

            if (!mSocket.Poll(0, SelectMode.SelectRead))
            {
                return(0);
            }

            var rn = 0;

            try
            {
                rn = mSocket.Receive(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, mRecvBuffer.WritableBytes,
                                     SocketFlags.None);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                rn = -1;
            }

            if (rn <= 0)
            {
                return(rn);
            }

            mRecvBuffer.WriterIndex += rn;

            // 检查加密
            if (block != null)
            {
                block.Decrypt(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes);
                var checksum = Crc32Algorithm.Compute(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex + cryptHeaderSize,
                                                      mRecvBuffer.ReadableBytes - cryptHeaderSize);
                uint data_checksum = 0;
                KCP.ikcp_decode32u(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex + nonceSize, ref data_checksum);
//                Console.WriteLine("checksum "+checksum+" ="+data_checksum);
                if (checksum == data_checksum)
                {
                    mRecvBuffer.ReaderIndex += cryptHeaderSize;
                }
                else
                {
                    // 丢弃数据包
                    rn = -1;
                    return(rn);
                }
            }

            var inputN = mKCP.Input(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes, true,
                                    true);

            if (inputN < 0)
            {
                mRecvBuffer.Clear();
                return(inputN);
            }

            mRecvBuffer.Clear();

            // 读完所有完整的消息
            for (;;)
            {
                var size = mKCP.PeekSize();
                if (size <= 0)
                {
                    break;
                }

                mRecvBuffer.EnsureWritableBytes(size);

                var n = mKCP.Recv(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, size);
                if (n > 0)
                {
                    mRecvBuffer.WriterIndex += n;
                }
            }

            // 有数据待接收
            if (mRecvBuffer.ReadableBytes > 0)
            {
                return(Recv(data, index, length));
            }

            return(0);
        }