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); }
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); }
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); }