using System.Buffers; using System.Threading.Tasks; namespace System.Net.Sockets.Kcp { /// /// 用于调试的KCP IO 类,没有Kcp功能 /// public class FakeKcpIO : IKcpIO { QueuePipe recv = new QueuePipe(); QueuePipe send = new QueuePipe(); public int Input(ReadOnlySpan span) { byte[] buffer = new byte[span.Length]; span.CopyTo(buffer); recv.Write(buffer); return 0; } public int Input(ReadOnlySequence span) { byte[] buffer = new byte[span.Length]; span.CopyTo(buffer); return Input(buffer); } public async ValueTask RecvAsync(IBufferWriter writer, object options = null) { var buffer = await recv.ReadAsync().ConfigureAwait(false); var target = writer.GetMemory(buffer.Length); buffer.AsSpan().CopyTo(target.Span); writer.Advance(buffer.Length); } public async ValueTask RecvAsync(ArraySegment buffer, object options = null) { var temp = await recv.ReadAsync().ConfigureAwait(false); temp.AsSpan().CopyTo(buffer); return temp.Length; } public int Send(ReadOnlySpan span, object options = null) { byte[] buffer = new byte[span.Length]; span.CopyTo(buffer); send.Write(buffer); return 0; } public int Send(ReadOnlySequence span, object options = null) { byte[] buffer = new byte[span.Length]; span.CopyTo(buffer); return Send(buffer); } public async ValueTask OutputAsync(IBufferWriter writer, object options = null) { var buffer = await send.ReadAsync().ConfigureAwait(false); Write(writer, buffer); } private static void Write(IBufferWriter writer, byte[] buffer) { var span = writer.GetSpan(buffer.Length); buffer.AsSpan().CopyTo(span); writer.Advance(buffer.Length); } } }