75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
|
using System;
|
|||
|
using System.Buffers;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace System.Net.Sockets.Kcp
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 用于调试的KCP IO 类,没有Kcp功能
|
|||
|
/// </summary>
|
|||
|
public class FakeKcpIO : IKcpIO
|
|||
|
{
|
|||
|
QueuePipe<byte[]> recv = new QueuePipe<byte[]>();
|
|||
|
public int Input(ReadOnlySpan<byte> span)
|
|||
|
{
|
|||
|
byte[] buffer = new byte[span.Length];
|
|||
|
span.CopyTo(buffer);
|
|||
|
recv.Write(buffer);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
public int Input(ReadOnlySequence<byte> span)
|
|||
|
{
|
|||
|
byte[] buffer = new byte[span.Length];
|
|||
|
span.CopyTo(buffer);
|
|||
|
return Input(buffer);
|
|||
|
}
|
|||
|
|
|||
|
public async ValueTask RecvAsync(IBufferWriter<byte> 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<int> RecvAsync(ArraySegment<byte> buffer, object options = null)
|
|||
|
{
|
|||
|
var temp = await recv.ReadAsync().ConfigureAwait(false);
|
|||
|
temp.AsSpan().CopyTo(buffer);
|
|||
|
return temp.Length;
|
|||
|
}
|
|||
|
|
|||
|
QueuePipe<byte[]> send = new QueuePipe<byte[]>();
|
|||
|
public int Send(ReadOnlySpan<byte> span, object options = null)
|
|||
|
{
|
|||
|
byte[] buffer = new byte[span.Length];
|
|||
|
span.CopyTo(buffer);
|
|||
|
send.Write(buffer);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
public int Send(ReadOnlySequence<byte> span, object options = null)
|
|||
|
{
|
|||
|
byte[] buffer = new byte[span.Length];
|
|||
|
span.CopyTo(buffer);
|
|||
|
return Send(buffer);
|
|||
|
}
|
|||
|
|
|||
|
public async ValueTask OutputAsync(IBufferWriter<byte> writer, object options = null)
|
|||
|
{
|
|||
|
var buffer = await send.ReadAsync().ConfigureAwait(false);
|
|||
|
Write(writer, buffer);
|
|||
|
}
|
|||
|
|
|||
|
private static void Write(IBufferWriter<byte> writer, byte[] buffer)
|
|||
|
{
|
|||
|
var span = writer.GetSpan(buffer.Length);
|
|||
|
buffer.AsSpan().CopyTo(span);
|
|||
|
writer.Advance(buffer.Length);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|