IKcpInterface.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System.Buffers;
  2. using System.Threading.Tasks;
  3. using BufferOwner = System.Buffers.IMemoryOwner<byte>;
  4. namespace System.Net.Sockets.Kcp
  5. {
  6. /// <summary>
  7. /// Kcp回调
  8. /// </summary>
  9. public interface IKcpCallback
  10. {
  11. /// <summary>
  12. /// kcp 发送方向输出
  13. /// </summary>
  14. /// <param name="buffer">kcp 交出发送缓冲区控制权,缓冲区来自<see cref="RentBuffer(int)"/></param>
  15. /// <param name="avalidLength">数据的有效长度</param>
  16. /// <returns>不需要返回值</returns>
  17. /// <remarks>通过增加 avalidLength 能够在协议栈中有效的减少数据拷贝</remarks>
  18. void Output(BufferOwner buffer, int avalidLength);
  19. }
  20. /// <summary>
  21. /// Kcp回调
  22. /// </summary>
  23. /// <remarks>
  24. /// 失败设计,<see cref="KcpOutputWriter.Output(BufferOwner, int)"/>。IMemoryOwner是没有办法代替的。
  25. /// 这里只相当于把 IKcpCallback 和 IRentable 和并。
  26. /// </remarks>
  27. public interface IKcpOutputWriter : IBufferWriter<byte>
  28. {
  29. int UnflushedBytes { get; }
  30. void Flush();
  31. }
  32. /// <summary>
  33. /// 外部提供缓冲区,可以在外部链接一个内存池
  34. /// </summary>
  35. public interface IRentable
  36. {
  37. /// <summary>
  38. /// 外部提供缓冲区,可以在外部链接一个内存池
  39. /// </summary>
  40. BufferOwner RentBuffer(int length);
  41. }
  42. public interface IKcpSetting
  43. {
  44. int Interval(int interval);
  45. /// <summary>
  46. /// fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
  47. /// </summary>
  48. /// <param name="nodelay">0:disable(default), 1:enable</param>
  49. /// <param name="interval">internal update timer interval in millisec, default is 100ms</param>
  50. /// <param name="resend">0:disable fast resend(default), 1:enable fast resend</param>
  51. /// <param name="nc">0:normal congestion control(default), 1:disable congestion control</param>
  52. /// <returns></returns>
  53. int NoDelay(int nodelay, int interval, int resend, int nc);
  54. /// <summary>
  55. /// change MTU size, default is 1400
  56. /// <para>** 这个方法不是线程安全的。请在没有发送和接收时调用 。</para>
  57. /// </summary>
  58. /// <param name="mtu"></param>
  59. /// <returns></returns>
  60. /// <remarks>
  61. /// 如果没有必要,不要修改Mtu。过小的Mtu会导致分片数大于接收窗口,造成kcp阻塞冻结。
  62. /// </remarks>
  63. int SetMtu(int mtu = 1400);
  64. /// <summary>
  65. /// set maximum window size: sndwnd=32, rcvwnd=128 by default
  66. /// </summary>
  67. /// <param name="sndwnd"></param>
  68. /// <param name="rcvwnd"></param>
  69. /// <returns></returns>
  70. /// <remarks>
  71. /// 如果没有必要请不要修改。注意确保接收窗口必须大于最大分片数。
  72. /// </remarks>
  73. int WndSize(int sndwnd = 32, int rcvwnd = 128);
  74. }
  75. public interface IKcpUpdate
  76. {
  77. void Update(in DateTimeOffset time);
  78. }
  79. public interface IKcpSendable
  80. {
  81. /// <summary>
  82. /// 将要发送到网络的数据Send到kcp协议中
  83. /// </summary>
  84. /// <param name="span"></param>
  85. /// <param name="options"></param>
  86. int Send(ReadOnlySpan<byte> span, object options = null);
  87. /// <summary>
  88. /// 将要发送到网络的数据Send到kcp协议中
  89. /// </summary>
  90. /// <param name="span"></param>
  91. /// <param name="options"></param>
  92. int Send(ReadOnlySequence<byte> span, object options = null);
  93. }
  94. public interface IKcpInputable
  95. {
  96. /// <summary>
  97. /// 下层收到数据后添加到kcp协议中
  98. /// </summary>
  99. /// <param name="span"></param>
  100. int Input(ReadOnlySpan<byte> span);
  101. /// <summary>
  102. /// 下层收到数据后添加到kcp协议中
  103. /// </summary>
  104. /// <param name="span"></param>
  105. int Input(ReadOnlySequence<byte> span);
  106. }
  107. /// <summary>
  108. /// kcp协议输入输出标准接口
  109. /// </summary>
  110. public interface IKcpIO : IKcpSendable, IKcpInputable
  111. {
  112. /// <summary>
  113. /// 从kcp中取出一个整合完毕的数据包
  114. /// </summary>
  115. /// <returns></returns>
  116. ValueTask RecvAsync(IBufferWriter<byte> writer, object options = null);
  117. /// <summary>
  118. /// 从kcp中取出一个整合完毕的数据包
  119. /// </summary>
  120. /// <param name="buffer"></param>
  121. /// <param name="options"></param>
  122. /// <returns>接收数据长度</returns>
  123. ValueTask<int> RecvAsync(ArraySegment<byte> buffer, object options = null);
  124. /// <summary>
  125. /// 从kcp协议中取出需要发送到网络的数据。
  126. /// </summary>
  127. /// <param name="writer"></param>
  128. /// <param name="options"></param>
  129. /// <returns></returns>
  130. ValueTask OutputAsync(IBufferWriter<byte> writer, object options = null);
  131. }
  132. }