KcpOutputWriter.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System.Buffers;
  2. namespace System.Net.Sockets.Kcp
  3. {
  4. public abstract class KcpOutputWriter : IKcpOutputWriter
  5. {
  6. public IMemoryOwner<byte> MemoryOwner { get; set; }
  7. public int UnflushedBytes { get; set; }
  8. public void Flush()
  9. {
  10. Output(MemoryOwner, UnflushedBytes);
  11. MemoryOwner = null;
  12. UnflushedBytes = 0;
  13. }
  14. public void Advance(int count)
  15. {
  16. UnflushedBytes += count;
  17. }
  18. public Memory<byte> GetMemory(int sizeHint = 0)
  19. {
  20. if (MemoryOwner == null)
  21. {
  22. MemoryOwner = MemoryPool<byte>.Shared.Rent(2048);
  23. }
  24. return MemoryOwner.Memory.Slice(UnflushedBytes);
  25. }
  26. public Span<byte> GetSpan(int sizeHint = 0)
  27. {
  28. if (MemoryOwner == null)
  29. {
  30. MemoryOwner = MemoryPool<byte>.Shared.Rent(2048);
  31. }
  32. return MemoryOwner.Memory.Span.Slice(UnflushedBytes);
  33. }
  34. /// <summary>
  35. /// Socket发送是要pin byte[],为了不阻塞KcpFlush,动态缓存是必须的。
  36. /// </summary>
  37. /// <param name="buffer"></param>
  38. /// <param name="avalidLength"></param>
  39. public abstract void Output(IMemoryOwner<byte> buffer, int avalidLength);
  40. }
  41. }