FakeKcpIO.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System.Buffers;
  2. using System.Threading.Tasks;
  3. namespace System.Net.Sockets.Kcp
  4. {
  5. /// <summary>
  6. /// 用于调试的KCP IO 类,没有Kcp功能
  7. /// </summary>
  8. public class FakeKcpIO : IKcpIO
  9. {
  10. QueuePipe<byte[]> recv = new QueuePipe<byte[]>();
  11. QueuePipe<byte[]> send = new QueuePipe<byte[]>();
  12. public int Input(ReadOnlySpan<byte> span)
  13. {
  14. byte[] buffer = new byte[span.Length];
  15. span.CopyTo(buffer);
  16. recv.Write(buffer);
  17. return 0;
  18. }
  19. public int Input(ReadOnlySequence<byte> span)
  20. {
  21. byte[] buffer = new byte[span.Length];
  22. span.CopyTo(buffer);
  23. return Input(buffer);
  24. }
  25. public async ValueTask RecvAsync(IBufferWriter<byte> writer, object options = null)
  26. {
  27. var buffer = await recv.ReadAsync().ConfigureAwait(false);
  28. var target = writer.GetMemory(buffer.Length);
  29. buffer.AsSpan().CopyTo(target.Span);
  30. writer.Advance(buffer.Length);
  31. }
  32. public async ValueTask<int> RecvAsync(ArraySegment<byte> buffer, object options = null)
  33. {
  34. var temp = await recv.ReadAsync().ConfigureAwait(false);
  35. temp.AsSpan().CopyTo(buffer);
  36. return temp.Length;
  37. }
  38. public int Send(ReadOnlySpan<byte> span, object options = null)
  39. {
  40. byte[] buffer = new byte[span.Length];
  41. span.CopyTo(buffer);
  42. send.Write(buffer);
  43. return 0;
  44. }
  45. public int Send(ReadOnlySequence<byte> span, object options = null)
  46. {
  47. byte[] buffer = new byte[span.Length];
  48. span.CopyTo(buffer);
  49. return Send(buffer);
  50. }
  51. public async ValueTask OutputAsync(IBufferWriter<byte> writer, object options = null)
  52. {
  53. var buffer = await send.ReadAsync().ConfigureAwait(false);
  54. Write(writer, buffer);
  55. }
  56. private static void Write(IBufferWriter<byte> writer, byte[] buffer)
  57. {
  58. var span = writer.GetSpan(buffer.Length);
  59. buffer.AsSpan().CopyTo(span);
  60. writer.Advance(buffer.Length);
  61. }
  62. }
  63. }